6 个版本
0.3.1 | 2023年12月14日 |
---|---|
0.3.0 | 2023年12月3日 |
0.2.1 | 2023年8月31日 |
0.1.1 | 2023年8月9日 |
#230 在 WebAssembly
每月 33 下载
22KB
95 行
plugy
plugy 是一个插件系统,旨在使基于 Rust 的插件能够无缝集成到您的应用程序中。它为加载和执行用 WebAssembly(Wasm)编写的插件提供运行时环境,使您的 Rust 项目能够实现动态扩展和模块化。
功能
- 加载和执行编译为 WASM 的插件。
- 灵活的插件运行时管理。
- 对插件函数的调用是异步的。
- 用于生成插件接口的简单宏。
入门指南
要在 Rust 项目中使用 plugy,请按照以下步骤操作
- 编写您的插件特质
#[plugy::plugin]
trait Greeter {
fn greet(&self) -> String;
}
- 编写您的第一个插件实现
#[derive(Debug, Deserialize)]
struct FooPlugin;
#[plugin_impl]
impl Greeter for FooPlugin {
fn greet(&self) -> String {
"Hello From Foo Plugin".to_owned()
}
}
编译它!
cargo build --target wasm32-unknown-unknown
- 导入并运行
#[plugin_import(file = "target/wasm32-unknown-unknown/debug/foo_plugin.wasm")]
struct FooPlugin;
#[tokio::main]
async fn main() {
let runtime = Runtime::<Box<dyn Greeter>>::new().unwrap();
let handle = runtime.load(FooPlugin).await.unwrap();
let res = handle.greet().await;
assert_eq!(res, "Hello From Foo Plugin")
}
您就完成了!
示例
请查看 示例 目录,了解 plugy 的使用示例。
里程碑
状态 | 目标 | 标签 |
---|---|---|
✅ | 在插件函数中接受多个参数(n-ary) | 完成 |
✅ | 在主机和客户机之间传递上下文 | 完成 |
功能
Plugy 包含三个基本 crate,每个 crate 在使用 Rust 和 WebAssembly 构建动态插件系统时扮演着不同的角色
-
核心:此 crate 包含位操作工具和客户机模块等基本组件,构成 Plugy 功能的基础。
-
运行时:运行时 crate 协调您的插件系统的执行,允许插件无缝集成到您的应用程序中。
-
宏:宏 crate 提供了一组宏,简化了绑定和接口的生成,简化了与动态插件一起工作的过程。
贡献
欢迎为 plugy 贡献!如果您发现错误或希望提出新功能,请随时创建问题或提交拉取请求。
感谢
- Wasmtime
- Bincode
- Serde
- Wasmtime-Serde 启发了此项目的许多内部工作
许可证
本项目采用 MIT 或 Apache-2.0 许可证。
依赖
~0–11MB
~119K SLoC