# 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 :<路径>` | 任一**内容不一致** / **包内多余**(既不在 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) | 产物**对着仓库**看有没有多、少、被改过的文件 |