wit/ 中 WIT 包的版本(main 上是 openidea:plugin@1.5.0)。宿主的引擎版本和 SDK 的 API_VERSION 始终与它一致,SDK 里也带着一份完全相同的 WIT 文件。
插件系统目前是预览版。下面的兼容规则适用于已发布的 1.x 版本;
main 上尚未发布的内容在发布前仍可能变化。版本历史
每个版本新增内容的完整列表见
plugins/README.md。
声明所需版本
plugin.toml 中的 engines.openidea 是对插件 API 的 semver 版本要求:
- 要求与 IDE 自身的 API 版本不匹配时,IDE 拒绝安装或加载该插件包。
- 选择能覆盖你所用功能的最低版本。
^1.0能在所有 1.x IDE 中加载。 - 部分清单功能会强制最低版本:清单用了它们却仍兼容更旧的 API 时,安装和
openidea-plugin check都会拒绝。
组件本身的版本
除了清单,IDE 还会读取组件构建时所针对的 API 版本:组件所有openidea:plugin/* 导入和导出中的最高版本,也就是编译时所用 SDK(或 WIT 文件)的版本。
- 组件的主版本不同,或次版本比 IDE 实现的更新时,安装和
openidea-plugin check会拒绝它,并提示更新 IDE 或用较旧的 SDK 重新构建。 - 它们还会把组件与 IDE 实际链接一次。如果组件导入了 IDE 在同一版本下没有的函数(用未发布的 WIT 构建),同样会被拒绝。
check会打印这个版本:code: dist/plugin.wasm (…, plugin API 1.4)。
openidea-plugin new 生成的插件依赖工具所在版本 tag 的 SDK:
main 构建的组件使用的是未发布的 API,无法在已发布的 IDE 中加载。
在插件市场索引中,每个版本的 engine 是清单的要求再收窄到组件的 API(例如 ^1.0, ^1.4)。一个插件可以同时列出多个版本,每个 IDE 会得到它能加载的最新版本;一个都加载不了时,插件显示为不兼容,并说明所需的 API。
兼容规则
wasmtime 按 semver 链接组件:导入openidea:plugin/x@1.0.0 的组件可以链接到定义了 @1.4.0 的宿主。但函数类型必须完全一致,所以已发布的 1.x 只能增加:
- 已发布的类型和签名永不改变。 不加 record 字段、不加 variant 或 enum 分支、不改名、不加参数。新功能用新类型和新函数。会持续增长的集合(补全类型、图标、事件类型等)用字符串表示;会增长的 variant 都有一个
other分支,携带类型名和 JSON 数据,让旧插件和旧 IDE 能原样传递。 - 宿主 interface(导入)可以增加函数和 interface。 旧组件不会导入它们。
- 插件 interface(导出)一旦发布就不再增加函数。 插件侧的新功能放进新 interface,对应新的可选 world。
- 宿主检查每个组件的 API 版本,如上所述。
- 一个版本号贯穿
wit/、宿主和 SDK。 - 1.x 调用是同步的,文档整体传递。 WASI 0.3 异步组件计划在 2.0 引入,宿主中的适配层会让 1.x 插件继续运行。
sdk/rust/openidea-plugin/tests/api_frozen.rs把wit/与最新已发布版本的快照sdk/rust/openidea-plugin/tests/api/released/(当前为 1.4.0)比较,所有已发布的 interface、类型、函数和 world 都必须原样存在。crates/ide-plugin/tests/api_compat.rs检查各处版本一致、SDK 的 WIT 副本一致,以及模拟的下一个次版本宿主仍能链接所有已发布组件,而不同主版本的宿主不能。- 如果
wit/的版本没有对应快照,发布流程会拒绝发布。
旧清单
0.1 格式的清单(openidea-api = "0.1")中的贡献仍能加载,但 0.1 的代码不再运行,需要用 1.x SDK 重新构建。