|
4 | 4 | |---|---| |
5 | 5 | | 规范编号 | SPEC-007 | |
6 | 6 | | 标题 | 构建插件:配置、施工与校验的分工,运行时与规划期的义务 | |
7 | | -| 状态 | 草案 v0.2 | |
8 | | -| 版本 | 0.2 | |
9 | | -| 最后修改 | 2026-09-26 | |
10 | | -| 对应实现 | 逐条标注。未注明版本的「已实现」条款对应 mcpp >= 2026.9.26.1;注明 mcpp#702 的条款对应 mcpp >= 2026.9.26.2 | |
| 7 | +| 状态 | 草案 v0.3 | |
| 8 | +| 版本 | 0.3 | |
| 9 | +| 最后修改 | 2026-09-27 | |
| 10 | +| 对应实现 | 逐条标注。未注明版本的「已实现」条款对应 mcpp >= 2026.9.26.1;注明 mcpp#702 的条款对应 mcpp >= 2026.9.26.2;注明 mcpp#707、#708、#709、#711 的条款对应 mcpp >= 2026.9.27.1 | |
11 | 11 | | 相关设计文档 | `.agents/docs/2026-09-26-compile-database-and-issue-699-design.md`(§5) | |
12 | | -| 相关 issue | mcpp#699、mcpp#701、mcpp#702、mcpp#703 | |
| 12 | +| 相关 issue | mcpp#699、mcpp#701、mcpp#702、mcpp#703、mcpp#707、mcpp#708、mcpp#709、mcpp#711 | |
13 | 13 | | 使用文档 | [docs/30 - build.mcpp](../30-build-mcpp.md)、[docs/31 - 编写规则包](../31-authoring-a-rule-package.md) | |
14 | 14 |
|
15 | 15 | 本规范规定构建插件对引擎和对消费方承担的义务,以及引擎为此提供的机制。docs/31 说明怎样编写 |
|
126 | 126 | 下载的 action(例如由包管理器取得源码)**必须**在其说明中写明,并在离线构建中 |
127 | 127 | (`--offline` 或 `MCPP_OFFLINE=1`;前者在进程环境中设置后者,action 继承之)不访问网络: |
128 | 128 | 从缓存完成,或以指出缺失内容的消息失败。(作者义务;环境传递 **已实现**) |
| 129 | +- **R3.8** action 需要的环境变量与工作目录**必须**用 `env(name, value)` 与 `cwd(dir)` 声明 |
| 130 | + (协议 13),**禁止**写成命令中的 shell 语法(`NAME=value cmd`、`cd dir &&`),因为 R3.1 |
| 131 | + 不假定 shell。引擎的 action 包装器在运行命令前设置它们:`cwd` 按声明包的根目录解析;声明的 |
| 132 | + 输入、输出与 stamp 在规划时解析为绝对路径,不受 `cwd` 影响;命令参数原样传给命令,其中的 |
| 133 | + 相对路径相对于 `cwd`。变量的值属于这条边的命令行,值改变时该 action 重新运行。两者都未 |
| 134 | + 声明的 action,其命令行与协议 12 逐字节相同。(**已实现**,mcpp#708) |
129 | 135 |
|
130 | 136 | ## 4. 运行时:程序依赖的共享库的查找 |
131 | 137 |
|
|
149 | 155 | 的配置与构建相同。(**已实现**) |
150 | 156 | - **R5.2** 一个包的构建程序在规划中失败时,该包只按其清单描述,并得到一条错误诊断;成员的 |
151 | 157 | 其余部分照常描述。插件遵守 R1.2 时,环境不完整不会使构建程序失败。(**已实现**,mcpp#702) |
152 | | -- **R5.3** 插件所需的宿主工具在规划中构建失败时,规划继续,构建程序收到该工具将被发布的路径, |
153 | | - 并产生一条警告。插件**应当**在 action 中运行宿主工具,而不是在构建程序中运行,使规划不依赖 |
154 | | - 工具能否构建。(引擎部分 **已实现**,mcpp#702;「应当」为作者义务) |
| 158 | +- **R5.3** 规划不构建宿主工具(SPEC-005 R2.5)。全局工具库中已有的工具照常使用;没有的工具 |
| 159 | + 被推迟,规划产生一条 note `MCPP_BUILD_DATABASE_HOST_TOOL_DEFERRED`,点名工具与其所属包, |
| 160 | + 请求它的构建程序收到该工具将被发布的路径。插件**应当**在 action 中运行宿主工具,而不是在 |
| 161 | + 构建程序中运行,使规划不依赖工具是否已经构建。(引擎部分 **已实现**,mcpp#707;此前规划 |
| 162 | + 构建宿主工具,构建失败时降级为警告,mcpp#702;「应当」为作者义务) |
155 | 163 |
|
156 | 164 | ## 6. 环境与载荷 |
157 | 165 |
|
|
160 | 168 | 的包上:`xpkg_dir` 为正在构建的包回答;`host-module` 的声明对编入它的每个构建程序可见 |
161 | 169 | (docs/31)。(**已实现**) |
162 | 170 | - **R6.2** 插件**禁止**探测宿主路径来寻找工具或 SDK;未声明的依赖不可复现。(作者义务) |
| 171 | +- **R6.3** 插件的某个特性需要本包的程序在构建机器上运行时,**应当**在该特性上声明 |
| 172 | + `[features.<f>] tools = ["<bin>"]`,而不是要求每个消费方在依赖边上重复写 `tools`。启用该 |
| 173 | + 特性的消费方得到该工具,与边上写了 `tools` 相同(SPEC-004 §10.2)。(**已实现**,mcpp#709) |
| 174 | +- **R6.4** 一个需要随消费方发布、在消费方的目标上运行的程序(更新器、辅助进程)**必须**以依赖 |
| 175 | + 边的 `artifacts` 取得(SPEC-004 §10.3),**禁止**以 `tools` 取得:`tools` 为构建机器构建, |
| 176 | + 交叉构建中得到错误架构的程序。action 以 `${mcpp.artifact:<依赖>/<目标>}` 引用它的路径。 |
| 177 | + (**已实现**,mcpp#711) |
163 | 178 |
|
164 | 179 | ## 7. 版本与兼容 |
165 | 180 |
|
|
182 | 197 | | 版本 | 日期 | 变更 | |
183 | 198 | |---|---|---| |
184 | 199 | | 0.1 | 2026-09-26 | 首版草案(mcpp#699、#701、#702、#703)。 | |
| 200 | +| 0.3 | 2026-09-27 | 随 mcpp 2026.9.27.1:新增 R3.8(action 的 `env` 与 `cwd`,协议 13,mcpp#708);R5.3 改为规划不构建宿主工具、缺失的工具以 note 推迟(mcpp#707);新增 R6.3(特性的 `tools`,mcpp#709)与 R6.4(`artifacts` 与 `${mcpp.artifact:}`,mcpp#711)。 | |
185 | 201 | | 0.2 | 2026-09-26 | 随 mcpp 2026.9.26.2 落地:R1.3 的警告、R2.1 的 `runtime_search_dir`、R2.4、R3.3 的 `prepare`(目录须含文件;链接边等待所有 `prepare`)、R3.5、R3.6、R4.1、R4.3、R5.2、R5.3 标为已实现。 | |
0 commit comments