2 个版本

0.1.1 2019 年 7 月 30 日
0.1.0 2019 年 7 月 30 日

#31#malware

Apache-2.0 许可

6KB
88

plugin-system

使用 Cargo 实现的 Rust 项目插件管理系统

这是什么?

该插件系统可以在用户端软件中部署,包括一个“核心”组件和可选的“插件”,这些插件可以向核心添加功能。

传统上,当用户安装软件时,用户直接下载核心软件,然后下载可选的 .dll 插件文件,这些文件是动态链接到核心的。

一种改进的变体是核心软件提供一个接口以下载 .dll 插件,从而避免用户手动拖放文件。

此插件系统通过完全移除动态链接机制进一步改进。当软件下载时,用户只需安装 Rust 工具链和此插件系统。然后用户编辑一个声明所需插件的文件。然后,当软件启动时,在名为 "stage" 的目录中生成一个临时 crate($STAGE_DIR),并在该子进程中自动运行 cargo run。这种方法具有几个优点

  • 所有二进制文件都是本地编译的,从而降低了恶意软件传播的风险。
  • 库是静态链接的,因此每个库只下载和编译一次(除非它们具有不兼容的版本)。
  • 库是静态链接的,因此多个插件可以无缝交互。
  • 在此处插入开源软件的所有优点

但也有一些缺点

  • 第一次或当用户更改插件列表时,重新编译需要很长时间。
  • 分发的插件必须是开源的。
  • 在此处插入反对开源软件的所有论点

结构

  • plugin-runtime-codegen:用于 plugin-runtime 的复杂宏定义。
  • plugin-runtime:在运行时由核心和插件加载。
  • plugin-system:由包装 crate 加载。
  • example/usage:示例包装 crate。
  • example/core:示例核心。
  • example/plugins/foo:示例插件,不直接使用于 example/usage,但依赖于 example/plugins/bar
  • example/plugins/bar:示例插件,依赖于 example/plugins/foo

在测试示例时,设置 PS_LOCAL_RUNTIME 环境变量(为任何值)以确保它依赖于本仓库中的 plugin-runtime crate 而不是来自 crates.io 注册表的版本。否则,可能会因为使用了多个版本的 plugin-runtime 导致编译失败。

依赖关系

~2.5MB
~55K SLoC