编写扩展
Rust 应用可以共享普通模块,也可以编写供 Go 和 TypeScript 应用加载的原生扩展。Rust 应用通过 crate feature 启用能力,而不是在配置中列出 extensions。
#选择扩展类型
| 你要添加的内容 | 需要交付的内容 |
|---|---|
| 组件或应用逻辑 | 一个 Rust 模块或 crate |
| 可选的 QuickGUI 能力 | updater 和 terminal 等 Cargo feature |
| 供 Go 或 TypeScript 使用的原生服务 | 一个 cdylib、一份清单,以及类型化包装 |
Rust 应用已经链接 quickgui。它不会再加载单独的宿主库。
#创建扩展项目
quickgui init-extension my-extension --type rust当 Go 或 TypeScript 应用需要消费原生服务时使用此方式。--npm-package 设置产物包名称。
#共享组件
导出返回 Element 的函数:
use quickgui::{Color, Element, text};
pub fn notice(message: impl Into<std::sync::Arc<str>>) -> Element {
text(message)
.p(12.0)
.bg(Color::rgb8(239, 246, 255))
.text_color(Color::rgb8(30, 64, 175))
.rounded(8.0)
}把 notice("Saved") 作为子节点返回。把应用级服务放在 View::render 之外。
#组织原生扩展
原生扩展交付 quickgui.extension.json、带版本的共享库,以及声明的资源。Rust 扩展可以内置 extension_api.rs,并构建 cdylib,无需链接渲染器。原生接口见 Go 的编写扩展指南。
#声明依赖
Rust 应用在 Cargo.toml 中启用 feature。保留项目里已有的 crate 版本:
[dependencies]
quickgui = { version = "...", features = ["terminal"] }Go 和 TypeScript 使用者在自己的配置中声明扩展包。
#实现原生接口
实现 invoke 和 shutdown。返回前先复制借用的输入,把事件限制在所属会话内,并在会话停止时释放 worker。
#自动注册
Go 和 TypeScript CLI 会打包已声明的扩展。Rust 应用没有额外要注册的内容:Cargo 会链接你依赖的 crate。
#构建与打包产物
应用编辑只会重建所选 crate。原生实现变化时重建扩展,然后再重建使用它的 Go 或 TypeScript 应用。
#测试与分发
用生成的演示应用测试打包后的 cdylib。Rust 应用直接调用 crate API,而不是 invokeExtension。
