Files
opendance-windows/tasks/025-tracked-release-check.md
T
zijunchiang 20c6682202 test(release): 逐文件核对「发布包 == 打标签的树」(T-WIN-025)
「发布包 == 打标签的树」此前只抽查几个文件,必然会漏。新增
build/check-tracked-release.py(纯标准库,直接读 LZMA zip):对包内**每一个**文件
按路径决定基准 —— OpenDance.exe / OpenDance.pck 比工作树 build/windows/ 的导出结果,
其余文件比 git show <tag>:<路径>;内容不一致 / 包内多余 / 构建产物缺失都会列出并退出 1。
已接入 build/accept-release.sh(第 0 步)与 build/package-release.sh 的提示。

实测(已发布的 v0.2.5 资产重新下载后):
  包内 13 个文件:源码/文档 11(与 tag v0.2.5 比)+ 构建产物 2(与工作树导出比)
  ✓ 逐文件一致:0 处不一致 / 0 处多余 / 0 处缺失
反向验证:把包内 README.txt 追加一行后用 7z 重打成 LZMA zip →
  ✗ 内容不一致 1 处(README.txt),退出码 1。

踩坑:脚本第一版把 BUILD_OUTPUTS 的键一律当目录前缀(rel[len(prefix):]),
而本仓产物是单文件,拼出 build/windows/OpenDance.exe/ 导致误报「工作树缺失」;
现在区分「以 / 结尾的目录前缀」与「精确文件名」两种键。
2026-09-18 03:10:15 +08:00

2.4 KiB
Raw Blame History

T-WIN-025:逐文件核对「发布包 == 打标签的树」

  • 状态: done
  • 依赖: T-WIN-018(发布包级验收)
  • 文档: v1.6 §5.3 / §7.7
  • 契约: 不涉及

为什么需要

「发布包里的东西必须等于打标签的那棵树」此前只靠抽查几个文件 (README、contracts/VERSION…),而抽查必然会漏。上一轮实测暴露两个认知错误:

  • Web 的发布包包含 web-server/test/**(33 个文件),而我此前以为不含;
  • 发布包里另有构建产物(本仓是 OpenDance.exe / OpenDance.pck)与 git 无关, 必须与工作树的导出结果比。

实现

build/check-tracked-release.py(纯标准库,.zip 直接读,LZMA 也支持): 对包内每一个文件按路径决定比较基准

路径 比较基准
OpenDance.exe / OpenDance.pck(BUILD_OUTPUTS) 工作树 build/windows/ 下的导出产物
其余全部 git show <tag>:<路径>

任一内容不一致 / 包内多余(既不在 git 也不是声明的构建产物)/ 构建产物在工作树缺失 都会列出并以非 0 退出。已接入 build/accept-release.sh (第 0 步;目标须是 .zip 且仓库里有对应 tag)与 build/package-release.sh 的提示。

实测(已发布的 v0.2.5 资产重新下载后跑)

[accept] 逐文件核对:发布包 == tag v0.2.5
  包内 13 个文件:源码/文档 11(与 tag 比)、构建产物 2(与工作树构建比)
  ✓ 逐文件一致:0 处不一致 / 0 处多余 / 0 处缺失

反向验证:把包内 README.txt 追加一行后用 7z 重新打成 LZMA zip →

✗ 内容不一致 1 处:· README.txt(与 v0.2.5 的内容不一致)
✗ 发布包与打标签的树不一致        退出码=1

踩坑

脚本第一版把 BUILD_OUTPUTS 的键一律当目录前缀处理(rel[len(prefix):]), 而本仓与 Android 的产物是单文件(键不带 /),于是拼出 build/windows/OpenDance.exe/ 这种路径,误报「构建产物在工作树缺失」。 现在区分两种键:以 / 结尾的是目录前缀,否则是精确文件名。

与「产物内开发残留检查」的区别

检查 回答的问题
list-pck.gd(T-WIN-023) 产物内部(pck 里)有没有混进开发/验收工具
本脚本(T-WIN-025) 产物对着仓库看有没有多、少、被改过的文件