@@ -18,7 +18,7 @@ description: Use when releasing a new version of mcpp — bumps version, creates
1818
1919跨方案的序是单调的:` 0.0.109 ` < ` 2026.7.27.1 ` ,第一段从 ` 0 ` 变 ` 2026 ` ,不存在回退。
2020
21- > 比较逻辑见 ` src/version_req.cppm ` 。它支持 4 段;** 改动那里时务必保证 ` str() ` 精确回写** ,
21+ > 比较逻辑见 ` modules/versioning/ src/version_req.cppm` 。它支持 4 段;** 改动那里时务必保证 ` str() ` 精确回写** ,
2222> ` src/pm/resolver.cppm ` 用它重建依赖版本串,会流向 lock 文件与 xlings wire 地址。
2323> 尤其 ` .0 ` 结尾的版本不能塌成三段。
2424
@@ -31,7 +31,7 @@ mcpp 有 **三个持久化版本位置**,以及 `ci-fresh-install` 的一个
3131** 第一组:正在构建的版本** (发布时改,走 bump PR)
3232
33331 . ` mcpp.toml ` → ` [package].version ` — 构建系统读取的项目版本,release.yml 由它推导 tag
34- 2 . ` src/version.cppm ` → ` MCPP_VERSION ` — 编译期硬编码常量(` --version ` 输出、BMI 指纹、E0006 索引底线比较)
34+ 2 . ` modules/versioning/ src/version.cppm` → ` MCPP_VERSION ` — 编译期硬编码常量(` --version ` 输出、BMI 指纹、E0006 索引底线比较)
3535
3636这两处必须** 在同一个 commit 里** 一起改:` tests/e2e/01_help_and_version.sh ` 交叉比对
3737` mcpp.toml ` 与 ` mcpp --version ` ,只改一处 CI 立刻红。
@@ -59,7 +59,7 @@ unexpected`。那是调用它的 shell 的问题,不是脚本的缺陷 ——
5959` #!/usr/bin/env bash ` ,CI 也是用 ` bash ` 调的。别据此把这条 guard 当成坏的而跳过:
6060它是唯一能机器化捕捉 pin 漂移的东西。
6161
62- 也不要通过修改文档或 workflow 绕开动态 ` MCPP_PIN ` 设计。` src/platform /xlings/xlings.cppm ` 的
62+ 也不要通过修改文档或 workflow 绕开动态 ` MCPP_PIN ` 设计。` src/provider /xlings/xlings.cppm ` 的
6363` pinned::kXlingsVersion ` 仍是 xlings 版本的唯一真源。
6464
6565## 发布步骤
@@ -89,7 +89,7 @@ NEW_VERSION="2026.7.27.1"
8989git checkout -b " chore/bump-$NEW_VERSION "
9090
9191sed -i " s/^version.*=.*/version = \" $NEW_VERSION \" /" mcpp.toml
92- sed -i " s/MCPP_VERSION = \" .*\" /MCPP_VERSION = \" $NEW_VERSION \" /" src/version.cppm
92+ sed -i " s/MCPP_VERSION = \" .*\" /MCPP_VERSION = \" $NEW_VERSION \" /" modules/versioning/ src/version.cppm
9393
9494# 校验:mcpp.toml 与 MCPP_VERSION 相等,.xlings.json 不领先于正在构建的版本。
9595bash .github/tools/check_version_pins.sh
@@ -302,14 +302,14 @@ gh workflow run bump-formula.yml -R mcpp-community/homebrew-mcpp
302302
303303| 症状 | 原因 | 修复 |
304304| ------| ------| ------|
305- | ` mcpp X.Y.Z-1 ` 但 tag 是 ` vX.Y.Z ` | ` fingerprint .cppm` 版本未更新 | 更新 ` MCPP_VERSION ` ,重新打 tag |
305+ | ` mcpp X.Y.Z-1 ` 但 tag 是 ` vX.Y.Z ` | ` modules/versioning/src/version .cppm` 版本未更新 | 在 PR 中同步版本号;已发布版本使用新 tag |
306306| bump PR 里** 所有** CI job 都红在 bootstrap,报 ` package 'mcpp@X.Y.Z' not found ` | 把 ` .xlings.json ` bootstrap pin 一起 bump 了,CI 去装一个还没发布的版本 | 把 ` .xlings.json ` 回退到上一个已发布版本;不要修改运行时推导的 ` MCPP_PIN ` |
307307| main 上** 所有** workflow 都红在 bootstrap,报 ` package 'mcpp@X.Y.Z' not found ` ,而该版本确实已发布并已合入索引 | pin 推得比索引指针稳定早;客户端读 CDN artifact 不读 git 树 | 等 ` xim-index-latest.json ` 的 ` index_version ` 等于索引 main 短 SHA 后重跑;不要改 pin |
308308| ` xlings install mcpp ` (不带 ` @版本 ` )装到** 上一个** 版本,而索引文件里明明有新版本 | 同一平台表里两个 ` ["latest"] ` 键(手写索引 PR 追加而非替换),Lua 后写的赢 | 删掉陈旧的那行,使每个平台表只剩一个 ` ["latest"] ` 。** 精确 pin 仍可用,所以 mcpp 自己的 CI 不会报这个** |
309309| 自查 ` --version ` 显示旧版本,但源码已改 | ` target/<triple>/<指纹>/ ` 的指纹随版本变,` ls \| head -1 ` 取到了上一次构建的目录 | 用 ` ls -dt … \| head -1 ` 取最新构建 |
310310| Smoke test 输出旧版本 | CI 缓存了旧的 sandbox/target | 删除 GitHub Actions cache 后重跑 |
311- | e2e ` 01_help_and_version.sh ` 挂 | 只改了 ` mcpp.toml ` 没改 ` fingerprint .cppm` (它把两者交叉比对) | 同步两处正在构建的版本;注意这个 e2e 只在部分分片里跑,可能表现为"只有某个平台红" |
312- | xlings bootstrap 失败 | xlings 版本不兼容 | 改 ` src/platform /xlings/xlings.cppm::kXlingsVersion ` (唯一真源),再核对引用它的 workflow 与脚本;当前 pin-check 脚本修复前不能依赖它完成扫描 |
311+ | e2e ` 01_help_and_version.sh ` 挂 | 只改了 ` mcpp.toml ` 没改 ` modules/versioning/src/version .cppm` (它把两者交叉比对) | 同步两处正在构建的版本;注意这个 e2e 只在部分分片里跑,可能表现为"只有某个平台红" |
312+ | xlings bootstrap 失败 | xlings 版本不兼容 | 改 ` src/provider /xlings/xlings.cppm::kXlingsVersion ` (唯一真源),再核对引用它的 workflow 与脚本;当前 pin-check 脚本修复前不能依赖它完成扫描 |
313313| macOS/Windows 构建失败 | 需要等 Linux job 先完成 | 检查 Linux job 是否成功 |
314314| ` slim: FAIL: ... still not stripped ` | strip 工具没生效/被 pack 覆盖 | 别绕过断言——它就是为了拦住 34.8MB 的 tarball 再次发出去 |
315315| mirror leg 报 ` missing/unverified ` | 资产没传上去或还没传播 | 先 GET 核验(** 必须 GET,` curl -I ` 会骗你** ),gitcode 用 ` gitcode.com ` 直链而非 ` api. ` 主机;确认缺件后本地补传再 ` gh run rerun --failed ` (脚本幂等,已验证的资产会跳过) |
@@ -331,38 +331,30 @@ gh workflow run release.yml --ref "v$NEW_VERSION"
331331
332332## 紧急修复发版
333333
334- 如果发版后发现问题需要紧急修复:
334+ 已发布版本的修复仍走 PR 和新补丁版本,不直接推 main,不移动已有 tag,不删除
335+ 已发布资源后用不同字节替换。紧急程度不改变源码与公开安装包的对应关系。
335336
336- ``` bash
337- # 1. 在 main 上修复
338- git checkout main && git pull
339- # ... 修改代码 ...
340- git commit -m " fix: <what the fix does, in English>"
341- git push origin main
342-
343- # 2. 更新 tag 指向新 commit(包含修复)
344- git tag -d " v$NEW_VERSION "
345- git tag " v$NEW_VERSION "
346- git push origin " v$NEW_VERSION " --force
347-
348- # 3. 删除旧 release(如果已创建)
349- gh release delete " v$NEW_VERSION " --yes
350-
351- # 4. 重跑 release
352- gh workflow run release.yml --ref " v$NEW_VERSION "
353- ```
337+ 1 . 从最新 main 建修复分支,将修正、第一组的两处版本号与新 CHANGELOG 条目提交
338+ 到 PR。bootstrap 继续使用已发布版本。
339+ 2 . 完成实际 required checks 和独立生态审查后合入。只为已验证的新版本创建新 tag,
340+ 并确认它指向审查后的提交。
341+ 3 . 完成原有四平台 release 检查、双端资源校验、索引发布和普通客户端安装验证。
342+ GitCode 资源按本地及时补齐流程处理。
343+ 4 . 新版发布、镜像与索引均可实际下载后,再通过 PR 前移 bootstrap pin。
354344
355- ** 注意** :如果修复涉及版本号变化,应该 bump 到新的 patch 版本而不是覆盖旧 tag。
345+ 若原版本只是构建或上传尚未完成,可以在原 tag 源码不变的前提下恢复失败步骤。
346+ 同名资源仅在字节相同并完成下载校验时视为已存在;不同内容须先查明原因,不能
347+ 以删除重传或重指 tag 绕过冲突。
356348
357349## 文件清单
358350
359351| 文件 | 版本相关内容 |
360352| ------| -------------|
361353| ` mcpp.toml ` | ` version = "X.Y.Z" ` — 项目版本,release.yml 由它推导 tag |
362- | ` src/version.cppm ` | ` MCPP_VERSION = "X.Y.Z" ` — 编译期版本常量 |
354+ | ` modules/versioning/ src/version.cppm` | ` MCPP_VERSION = "X.Y.Z" ` — 编译期版本常量 |
363355| ` .xlings.json ` | ` workspace.mcpp ` — CI bootstrap 装哪个 mcpp(发布** 后** 才 bump) |
364356| ` .github/workflows/ci-fresh-install.yml ` | ` MCPP_PIN ` — 由 ` wait-index ` 从最新 release 推导,** 从不手工 bump** |
365- | ` src/platform /xlings/xlings.cppm ` | ` kXlingsVersion ` — xlings pin 的** 唯一真源** |
357+ | ` src/provider /xlings/xlings.cppm ` | ` kXlingsVersion ` — xlings pin 的** 唯一真源** |
366358| ` .github/tools/check_version_pins.sh ` | 版本/pin 校验 guard(** 用 ` bash ` 跑,不能用 ` sh ` ** ) |
367359| ` .github/tools/slim_linux_payload.sh ` | linux 载荷 strip + 断言 |
368360| ` .github/tools/mirror_res.sh ` | 双端镜像(并发上传 + leg deadline + 完整性 gate) |
@@ -371,7 +363,7 @@ gh workflow run release.yml --ref "v$NEW_VERSION"
371363| ` install.sh ` | 安装脚本(随 release 发布) |
372364| ` CHANGELOG.md ` | Release notes 来源(按 ` ## [X.Y.Z] ` 提取);条目、commit 与 release notes 一律用英文(2026.9.28.3 起) |
373365
374- > ** 注意版本 bump 的两个阶段** :` mcpp.toml ` + ` fingerprint .cppm` 在发版** 前** 改
366+ > ** 注意版本 bump 的两个阶段** :` mcpp.toml ` + ` modules/versioning/src/version .cppm` 在发版** 前** 改
375367> (它们定义要发什么);` .xlings.json ` 只在发版成功、镜像并进索引后才可更新
376368> (它指定 bootstrap 使用的已发布版本)。` MCPP_PIN ` 是被测版本的运行时推导值,
377369> 不属于任何手工 bump 阶段。这些关系由 ` bash .github/tools/check_version_pins.sh ` 校验。
0 commit comments