Skip to main content

export

Macro export 

Source
macro_rules! export {
    ($create:path) => { ... };
}
Expand description

生成插件的整个 C ABI 外壳。

用法是一行:

ⓘ
impl pmpx_plugin::PackageManager for MyPlugin { /* ... */ }

/// 工厂函数。crate-plugin-kit 生成的 wrapper 工程也会调它。
pub fn create() -> Box<dyn pmpx_plugin::PackageManager> {
    Box::new(MyPlugin)
}

pmpx_plugin::export!(create);

§它生成了什么

符号作用
pmpx_plugin_entry_v1唯一入口。返回一张 'static 的 PmpxPluginV1 表
name / family shim调你的实现,把 &str 泄漏成 PmpxStr
command shim读输入 → 调 crate::PackageManager::command → 写输出
free_str / free_command把上面产出的内存还回来

§输入必须是函数的路径

create 必须是一个返回 Box<dyn PackageManager> 的函数。不能传类型名, 因为你可能想在里面做构造参数注入。

这个形状不是随意定的:crate-plugin-kit 生成的 wrapper 工程里, src/lib.rs 的内容正是 <你的 crate>::create 的调用 —— 两边必须对得上。

§每次调用都新建实例,刻意不缓存

宿主一个进程只调几次(name / family 各一次,command 一次), 而缓存需要 OnceLock + 静态量 + Send + Sync 约束。为几次 Box::new 引入这些 不划算,也让生成的代码更难读。