**读者:**带着政策问题而来的人——一次评审流程、一次隔网构建、一个被钉住的版本。
**本章回答的那一个问题:**哪些发布受支持、支持多久,以及版本之间什么可以变、 什么不可以变。
**不在这里:**退出码表,那是 SPEC-003;机器输出的 schema,那是 50 —— 机器可读输出。
本文陈述哪些发布受支持、支持多久,以及版本之间允许发生什么变化。它的存在是因为 一个采用 mcpp 的工程会被自身的评审流程问到这些问题,而只存在于维护者脑子里的 答案无法被引用。
发布以 YYYY.M.D.N 命名——发布日期,加上当天发布的序号。这套方案的数字不携带
任何兼容性承诺:2026.9.4.1 不是 2026.9.3.2 的「小版本」。什么可以变、什么
不可以变,由下文陈述,而不是编码在版本号里。
| 受支持 | 最新的一个发布 |
| 安全修复 | 最新的发布,以及上一个自然月的最后一个发布 |
| 不受支持 | 更旧的一切 |
发布是被取代,不是被撤回。更旧版本的已发布资产与索引条目保持原位,因为某个工程 可能钉住了其中一个,移除会破坏一个本来能正常构建的工程。
引擎自身各个接口的稳定性并不相同,这个差别值得精确陈述。
| 面 | 稳定性 |
|---|---|
mcpp.toml 的键 |
只增。既有键保持原有含义;无法识别的键会被报告,不会被静默忽略。例外是下文的弃用 |
| CLI 命令与旗标 | 只增。被替换的拼写保留为别名 |
机器输出(--message-format json) |
由 schemaVersion 版本化,见 50 |
build.mcpp 指令协议 |
版本化,见 kProtocolVersion。引擎遇到声明版本高于自身的程序会拒绝,而不是猜测 |
mcpp.lock 格式 |
由 schemaVersion 版本化;更旧的文件在读取时被迁移 |
| 目标表的行 | 只增。一行的档位可以上升;只要还有已发布的包以它为目标,该行就不会被移除 |
构建指纹、缓存布局、target/ 的内容 |
不是接口。 它们不经通知即变化,任何东西都不应解析它们 |
一个调用了自身引擎所带 mcpp 模块中不存在的函数的 build.mcpp,失败发生在
构建程序的编译阶段,而不是通过协议错误。协议号管的是线上的指令;类型化 API
由所装的引擎决定。两者都写在这里,是因为包作者看到的失败取决于他越过了哪一条边界。
清单中将被移除的写法或读法先被弃用;"已有的键保持其含义"的例外,恰好是本表的各行 (mcpp 2026.10.11.1+)。
- 被弃用的写法照常工作。构建可以编辑的清单(根、工作空间成员、工作空间内的 path 包)
中的每次使用都给出警告,写出取代它的写法、弃用它的版本与移除它的版本;
--strict下拒绝。mcpp why compat列出所有使用,包括依赖中的使用。 - 移除以 CalVer 月份表示。弃用的版本与该月份之间至少相隔两个完整的日历月,读法在该月的 第一个版本或之后移除。
- 本表由引擎中的唯一登记表(
modules/manifest/src/compat/registry.cppm)生成;某个版本 到达某一行的月份而读法仍在时,引擎自己的测试失败。
| 读法 | 弃用版本 | 移除版本 | 应写作 |
|---|---|---|---|
workspace-position:工作空间根自己的 [toolchain]、[indices]、[profile.<name>]、[target.<triple>] 标量或 [xlings] 按位置到达成员 |
2026.10.10.1 | 2027.1 | [workspace.toolchain]、[workspace.indices]、[workspace.profile.<name>]、[workspace.target.<selector>]、[workspace.xlings] |
host-module-in-dependencies:[dependencies] 中请求 host-module = true 或 rule_module 特性的条目,按构建期依赖读取 |
2026.10.11.1 | 2027.1 | [build-dependencies] 中的同一条目 |
plugin-imports-from-build-dependencies:构建插件的库导入其自身 [build-dependencies] 中以 host-module = true 写出的包 |
2026.10.11.1 | 2027.1 | 插件 [dependencies] 中的该包 |
mcpp.lock 记录一次构建解析出的结果。--locked 断言当前解析与它一致,不一致
则失败,并点名发生变化的那个包:
error: --locked was given and this resolution differs from mcpp.lock:
mcpplibs.cmdline 0.0.1 -> 0.0.2
发布构建、审计或 CI 作业应当传入 --locked。它会关闭构建快路径,因此该断言
总会执行。
锁尚不约束解析——它只记录并校验解析结果。把锁作为解析的输入来钉住结果,是对 解析器的另一项改动。
mcpp emit sbom 写出一份描述已记录解析结果的 CycloneDX 1.5 文档:
mcpp emit sbom -o sbom.json它读取 mcpp.lock 而不是重新解析,因为一份描述了与实际构建不同的依赖图的
文档,比没有文档更糟。许可证 mcpp 无法识别的组件会被写成 NOASSERTION 而不是
省略:缺失的字段读起来像「未检查」。
--offline(或 MCPP_OFFLINE=1)会阻止一切网络访问:索引刷新、包下载与
工具链安装。需要其中之一的构建会点名自己所需要的东西并失败,而不是尝试联网。
缺陷与安全报告提交到拥有该组件的仓库的 issue tracker——引擎、包索引,或者 包本身。一份点明了版本、宿主、目标与命令的报告是可处理的;缺了这四项的报告 通常会换来一次索要它们的回复。
mcpp.lock目前尚不约束解析。 它记录一次构建解析出的结果,--locked核验新的解析与它一致;把锁作为解析的输入来钉住结果,是对解析器的另一项 改动。- SBOM 描述的是已记录的那次解析,而不是重新解析一次,因此在修改 manifest
之后、执行
mcpp update之前写出的文档,描述的是更早的那张依赖图。 - 许可证 mcpp 无法识别的组件会被写成
NOASSERTION而不是省略,因为缺失的 字段读起来像「未检查」。