2个版本

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

#28 in #declare


plugin-runtime 中使用

Apache-2.0

9KB
164

plugin-system

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

这是什么?

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

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

一个改进的版本是核心软件提供一个接口下载.dll插件,从而省去用户拖放文件的麻烦。

这个插件系统通过完全移除动态链接来进一步改进机制。当软件下载时,用户只需安装Rust工具链加上这个插件系统。然后用户编辑一个声明所需插件的文件。然后,当软件启动时,在名为“stage”的目录($STAGE_DIR)中生成一个临时crate,并在该子进程中自动运行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
约54K SLoC