模块开发与 Bundle 自动安装
开发不可变模块版本,由 Bundle 组合并自动安装到 Runtime。
当前平台没有独立的“模块市场”交付概念。模块是 Bundle 的内部资源,面向用户发布和安装 的是 Bundle:
module-service保存模块定义、不可变版本和安装 Artifact。- Bundle Manifest 引用精确的
moduleId + semanticVersion。 - Bundle Version 冻结后保存精确资源锁。
- 用户把 Bundle 安装到 Runtime,Bundle Service 自动物化其中的模块。
同一个模块在同一个 Runtime 中只能安装一次。Bundle 升级引用模块的新版本时,更新现有 模块安装,不会创建第二条同模块安装记录。
完整交付链
模块项目 Git
-> 在所属 Bundle 内冻结不可变模块版本
-> Bundle Manifest 引用精确模块版本
-> 冻结 Bundle Version 和 resolvedLock
-> 发布 Bundle
-> 用户把 Bundle 安装到 Runtime
-> Bundle Service 自动物化模块模块自动安装由 Bundle Service 完成,不需要为每个模块配一个插件服务。
第一步:开发模块
模块首先是一个可安装的运行时能力契约。模块项目至少要确定:
module.json中的名称、属性、用户域和依赖。methods/*.json中的方法名称、参数、返回值、错误语义和实现。- 哪些属性由用户填写,哪些来自 Runtime 或 Bundle 安装输出。
- 模块方法由页面、智能体、工作流还是后端服务调用。
- 模块状态和业务数据保存在哪里。
模块版本不是市场商品。冻结模块版本的目的,是生成可被 Bundle 精确引用和安装的不可变 资源。
第二步:选择运行与存储模式
外部服务不是模块获得存储能力的前置条件。是否使用外部服务,取决于业务逻辑和数据边界; 是否使用生命周期插件,则取决于整个 Bundle 是否需要自动管理平台外部资源。
| 模式 | 数据和状态位置 | Bundle 能否自动安装 | 是否需要 Bundle 生命周期插件 |
|---|---|---|---|
| Runtime 内业务模块 | Runtime 提供的模块数据或数据库能力 | 能 | 否 |
| 连接已有外部系统 | 企业已有 CRM、ERP、飞书或其他 SaaS | 能 | 否 |
| 无状态共享后端 | 独立服务,但没有每次安装的独立资源 | 能 | 否 |
| 需要自动开通外部资源 | 外部服务为每个 Bundle 安装创建租户、许可证、数据库或任务 | 能 | 是,属于高级开发 |
用户已经拥有第三方业务租户时,可以在安装配置中填写 vendorTenantId 和凭据。这是连接
已有账号,不需要为了自动安装模块增加生命周期插件。
第三步:在 Bundle 内冻结模块版本
从模块项目 Git 提交发布不可变模块版本:
baijimu bundle module freeze <workspace> <bundle> <projectId> \
--module-id <moduleId> \
--version <semanticVersion> \
--commit-id <commitId>这里生成的是 Bundle 可引用资源,不是把模块提交到独立市场。单独冻结模块新版本不会 改变 Bundle,也不会升级任何已安装 Runtime。
第四步:纳入 Bundle
在 Bundle Manifest 中引用精确模块版本:
{
"backendModules": [
{
"moduleId": 2200,
"semanticVersion": "1.3.0"
}
]
}Bundle 冻结时解析模块安装 Artifact 并写入 resolvedLock。Bundle 安装、升级和卸载
过程中,Bundle Service 负责模块资源编排和台账记录。
第五步:验证自动安装
至少使用两个不同 Runtime 验证:
- Bundle
resolvedLock引用了预期模块版本。 - Bundle 安装后模块方法、属性和用户域正确。
- 同一模块在同一 Runtime 不能重复安装。
- 安装重试不会生成重复模块记录。
- 同一 Bundle 安装到不同 Runtime 时,配置和业务数据相互隔离。
- Bundle 升级更新现有模块,同时保持安装身份和用户配置。
- 卸载不会影响其他 Runtime 中的安装。
- 失败资源在 Bundle 台账中保留明确错误,不能静默跳过。
什么时候进入高级开发
完成普通 Bundle 后,如果安装过程还必须执行以下动作,再进入 高级 Bundle 开发:
- 自动创建外部租户、数据库、许可证、存储空间或第三方账号。
- 多个模块和平台应用共享同一个外部安装实例。
- Bundle 升级需要迁移外部配置或数据。
- Bundle 卸载需要停用、保留或回收外部资源。
- 外部操作需要验证、重试、回滚或补偿。
生命周期插件属于整个 Bundle 的安装编排。模块只是插件可以读取安装结果或接收属性输出 的一类资源,不拥有插件注册和执行流程。