fix(packaging): 发布包 exe 的 PE 版本资源必须等于发布版本(v0.2.2)

缺陷(v0.2.1 实测):把 opendance-windows-v0.2.1.zip 解开、在 Windows 上
「右键 → 属性 → 详细信息」,显示的是

    文件版本    0.1.0
    产品版本    0.1.0

而产物名、Git tag、README 全是 v0.2.1 —— 正是文档 §11.2 要禁止的
「不可核对的发布」。

根因:export_presets.cfg 的 application/file_version /
application/product_version 被硬编码在 0.1.0,而它们**不会**跟随
project.godot 的 application/config/version 自动更新;check-version.sh 当时
只比 project.godot ↔ project.yaml(两处一致),所以静态校验全绿、产物却是错的。
漂移发生在没人看的第三个位置 —— 校验位置少一个,等于没校验。

证据:
  strings -a -el OpenDance.exe  ->  FileVersion 0.1.0 / ProductVersion 0.1.0
  VS_FIXEDFILEINFO @0x67b976c   ->  FileVersion 0.1.0.0 / ProductVersion 0.0.0.0
对照组:官方模板 windows_release_x86_64.exe 的 FileVersion = 4.7.2,
说明本机 rcedit 改写是生效的,问题纯粹在预设的值本身。

修复:
  * build/sync-export-version.sh(新增):导出前把版本号写进导出预设,
    幂等、拒绝非 X.Y.Z;
  * build/check-pe-version.sh(新增):直接读 exe 的 PE 版本资源 ——
    VS_FIXEDFILEINFO(签名 0xFEEF04BD 后 16 字节,grep -abo 取偏移约 40 ms)
    与 StringFileInfo(strings -el,资源管理器属性页显示的就是它)。
    两处都查:实测固定信息里的 ProductVersion 恒为 0.0.0.0;
  * build/check-version.sh:新增导出预设两个键的校验;
  * build/export-windows.sh:导出前同步、导出后直接复核产物;
  * build/package-release.sh:打包前校验源 exe、解包后再校验包内 exe;
  * build/verify.sh:新增步骤 1/5「产物 PE 版本资源」(未导出则跳过);
  * tests/test_about.gd:新增 test_export_preset_version_matches_project_version。

反向验证:把预设 file_version 改回 0.1.0 →
  check-version.sh 退出码 1(报出两处不一致);
  无头测试 753 通过 / 1 失败,失败项正是
  「导出预设的 file_version 与版本号唯一来源一致」。

实测 v0.2.2 产物:PE FileVersion 0.2.2.0 / StringFileInfo 0.2.2,
版本号在 project.godot / project.yaml / export_presets.cfg / exe 元数据 /
产物名 / tag 六处一致。verify.sh 全绿(754 通过 / 0 失败 / 5 跳过)。

同时把 LZMA 压缩的取舍写清楚:deflate 包 38,248,818 B 仍超 IIS
30,000,000 B 上限,故 Release 资产仍是 LZMA 整包(26,628,529 B,不拆分卷);
若上限放开或改由 Web /static 分发,用 ZIP_METHOD=deflate 重打包即可得到
资源管理器可直接双击解压的包。
This commit is contained in:
2026-09-17 04:22:57 +08:00
parent 14ee5f7ec9
commit ba988f6ca6
13 changed files with 450 additions and 35 deletions
+29 -8
View File
@@ -1,5 +1,5 @@
================================================================
OpenDance Studio -- Windows 客户端 v0.2.1 使用说明(zip 为 LZMA 压缩,需用 7-Zip/WinRAR 解压)
OpenDance Studio -- Windows 客户端 v0.2.2 使用说明(zip 为 LZMA 压缩,需用 7-Zip/WinRAR 解压)
================================================================
摄像头跳舞评分系统的核心体验端:接收 Android 辅助 App 通过 WebSocket
@@ -8,6 +8,19 @@ OpenDance Studio -- Windows 客户端 v0.2.1 使用说明(zip 为 LZMA 压缩
本客户端只接收关键点坐标,不接收、不存储任何视频画面。
v0.2.2 修订
1. 修复发布包 exe 的版本元数据: v0.2.1 的包在 Windows「右键 -> 属性 ->
详细信息」里显示的是 文件版本 0.1.0 / 产品版本 0.1.0, 而产物名与 Git tag
都是 v0.2.1。根因是 export_presets.cfg 的 application/file_version 与
application/product_version 被硬编码成 0.1.0, 而它们不会跟随 project.godot
的 application/config/version 自动更新。
2. 新增 build/sync-export-version.sh(导出前同步版本号到预设)与
build/check-pe-version.sh(直接读 exe 的 PE 版本资源复核: VS_FIXEDFILEINFO
的 FileVersion 与 StringFileInfo 的 FileVersion/ProductVersion 两处都查)。
check-version.sh 增加预设校验, package-release.sh 在打包前与解包后各校验一次,
verify.sh 增加步骤 1/5, tests/test_about.gd 增加对应单测。
3. 现在本包显示: 文件版本 0.2.2 / 产品版本 0.2.2。
v0.2.1 修订
1. 场景包围盒不再用 global_transform: SceneRuntime._compute_aabb() 原先在
_assemble() 里调用, 而那时节点还没入树 -> Godot 会打一行 ERROR
@@ -116,24 +129,32 @@ OpenDance.exe 的用户看第一节即可。
打成发布包:
bash build/package-release.sh 0.2.1
bash build/package-release.sh 0.2.2
得到 dist-release/ 下两个资产:
opendance-windows-v0.2.1.zip <- 单个完整包,禁止 .partN 分卷
opendance-windows-v0.2.2.zip <- 单个完整包,禁止 .partN 分卷
SHA256SUMS <- 裸文件名,可直接 sha256sum -c
包里含 OpenDance.exe、OpenDance.pck、THIRD_PARTY.md、README.txt、
README.md、contracts/。打包脚本会解压自检(exe + pck 必须同目录、
exe 的 PE 头为 MZ、pck 魔数为 GDPC)并打印包体与上传上限的对比。
exe 的 PE 头为 MZ、pck 魔数为 GDPC、exe 的 PE 版本资源 = 发布版本)
并打印包体与上传上限的对比。
注意:本项目 Gitea 前置 IIS 的默认上传上限是 30,000,000 字节
(约 28.6 MiB),超过会返回 HTTP 413。这时不要改成分卷,
请让运维放宽上限(做法见 opendance-web/deploy/proxy/README.md 第九节)。
发布 v0.2.0/v0.2.1 时该上限尚未放开,整包(约 38 MB)改用 LZMA 压缩到约 26 MB
才传上去(打包时用 ZIP_METHOD=lzma)。**因此 v0.2.0/v0.2.1 的 zip 需要
7-Zip / WinRAR / PeaZip 解压 —— Windows 10 资源管理器不支持 LZMA 的 zip**;
若上限已放开,请改用默认 deflate 包(双击即可解压)。
v0.2.0/v0.2.1/v0.2.2 该上限都尚未放开,整包(deflate 约 38 MB)改用
LZMA 压缩到约 26 MB 才传上去(打包时用 ZIP_METHOD=lzma)。
**因此这几个版本的 zip 需要 7-Zip / WinRAR / PeaZip 解压 ——
Windows 10 资源管理器不支持 LZMA 的 zip**。
如果你能把包放到别处分发(例如 Web 服务端的 /static,不受 IIS 那个
上限约束),建议改用资源管理器可直接双击解压的 deflate 包:
ZIP_METHOD=deflate bash build/package-release.sh 0.2.2 # 约 38 MB
上限一旦放开,Release 资产也应换回 deflate 包。
7. 自检清单