高级插件内部设计

本页面适用于希望更好地了解 FFX 插件系统的开发者。FFX 基于 argh crate 构建。此 crate 为 CLI 参数制定了 Google 标准。而 argh 期望定义 CLI 参数的结构在编译时是必需的。因此,这会排除所有运行时插件系统,因为 Rust 结构体在编译后无法修改。

这也意味着,任何添加插件的动态功能都必须在编译之前提供。为此,FFX 使用 GN 构建规则从提供的插件依赖项生成最终参数参数结构。您可以点击此处查看该代码。

插件可以访问整个 argh 结构。例如,配置插件需要访问“--config”标志,该标志是 ffx_args 库的一部分:

fx ffx --config "config-test=runtime" config get --name config-test

这意味着需要将生成的最终参数结构提供给这些插件。因此,ffx_plugin 模板会生成两个库:

  • <target_name>_args:包含提供给 CLI 的已解析参数。
  • <target_name>_args_test:包含当 args_with_unit_tests 设置为 true 时,_args 库生成的所有单元测试。

开发者用来修饰代码的 Rust 属性也会在编译时生成一些代码。

ffx_command 属性只需在 <target_name>_args 库中创建以下代码:

pub type FfxPluginCommand = <Your Command>;

这为库提供了一个已知的入口点,FFX 可以使用该入口点,同时让开发者能够随意为其命令命名。

ffx_plugin 属性会执行类似操作。

pub async fn ffx_plugin_impl(<Your methods inputs>) -> Result<()> {
    <Your method name>(<Your parameter names>).await
}