Client:统一发布产物命名并生成固定清单 #102

Closed
opened 2026-08-10 14:44:40 +08:00 by ila · 6 comments
Owner

基本信息

  • 类型:需求
  • 父级大工单:#1
  • 所属 MVP / 版本:MVP 后续 / 发布规范
  • 阶段:发布与升级
  • 依赖:#92、#93、#94

要解决什么

现有发布文件使用连字符和 Unicode 破折号,人工下载名称不够直观,在线清单名称也不适合作为长期稳定入口。需要统一产物命名,同时保留固定“最新清单”和版本化归档清单,保证旧 Client 配置能迁移并持续发现新版。

做什么 / 不做什么

  • 做:
    • 在线更新包命名为 CMAutoBuy_<版本>.zip。
    • 完整便携包命名为 自动采集采购工具_<版本>.zip。
    • 额外生成内容相同的最新版便携包别名 自动采集采购工具.zip,方便人工下载。
    • 生成固定在线入口 autobuy_manifest.json。
    • 同时生成内容相同的归档清单 autobuy_manifest_<版本>.json。
    • Manifest 的 update.file 指向版本化更新包,portable.file 固定指向 自动采集采购工具.zip;文件名、大小和 SHA256 与实际文件一致。
    • Client 默认更新地址改为固定 autobuy_manifest.json;保存过旧默认地址的本地设置自动迁移到新地址。
    • Client 版本保持为 0.1.0。
  • 不做:
    • 不改变发布目录内部 Launcher.exe + app/ + data/ 结构。
    • 不改变更新包内容、安全校验、认证、下次启动替换和回退逻辑。
    • 不让 Client 直接读取带版本号的归档清单作为默认入口。
    • 不改变 Admin 接口、SQLite 表结构、采购流程和真实下单开关。

怎么做

  • 修改 client/packaging/build.ps1 的 ZIP 与清单输出名称;版本化便携包先生成,固定别名使用复制,保证字节一致;Manifest 使用固定便携包别名。
  • 修改 client/build_tools/release_manifest.py 的固定清单常量,并增加版本化清单命名函数。
  • 修改 client/src/update_service.py 的默认清单 URL,保留旧默认 URL 常量供一次性配置迁移。
  • 在更新事件装配时,只把完全匹配旧默认值的本地 URL 更新为新固定入口;用户自定义地址不改。
  • 扩展打包、清单和配置迁移测试;同步 Client 上手指南、需求和质量基线中的文件名。

验收标准

  • 构建生成 CMAutoBuy_0.1.0.zip,内部只包含 app/。
  • 构建生成 自动采集采购工具_0.1.0.zip 和 自动采集采购工具.zip,两者字节和 SHA256 相同。
  • 构建生成 autobuy_manifest.json 和 autobuy_manifest_0.1.0.json,两者内容相同。
  • Manifest 的 update.file 为 CMAutoBuy_0.1.0.zip,portable.file 为 自动采集采购工具.zip,大小和 SHA256 与实际 ZIP 一致。
  • Client 默认读取固定 autobuy_manifest.json,而不是版本化清单。
  • 旧默认清单地址自动迁移;用户自定义更新地址保持不变。
  • 文件名使用约定一致,在线更新文件名保持 ASCII,人工便携包使用中文名称。
  • 自动测试、构建和打包启动冒烟通过,真实服务器文件替换未验证部分明确记录。
  • 真实下单默认关闭,Admin 接口和采购流程未改变。

怎么验证

从 client/ 执行:

$env:QT_QPA_PLATFORM="offscreen"
C:/Python310/python.exe -m pytest test -q --disable-warnings
Remove-Item Env:QT_QPA_PLATFORM
.\build_client.bat

检查 client/release/ 的文件名、两个清单内容、两个便携 ZIP 哈希和 Manifest 内的版本化 ZIP 哈希;最后离屏启动版本化发布目录。

风险和回退

  • 删除旧服务器清单前必须先上传新的固定清单和对应 ZIP;旧 Client 尚未升级���建议服务器暂时保留旧清单别名。
  • 可整体回退本工单提交并恢复旧命名;发布目录内部和本地数据结构不变。
## 基本信息 - 类型:需求 - 父级大工单:#1 - 所属 MVP / 版本:MVP 后续 / 发布规范 - 阶段:发布与升级 - 依赖:#92、#93、#94 ## 要解决什么 现有发布文件使用连字符和 Unicode 破折号,人工下载名称不够直观,在线清单名称也不适合作为长期稳定入口。需要统一产物命名,同时保留固定“最新清单”和版本化归档清单,保证旧 Client 配置能迁移并持续发现新版。 ## 做什么 / 不做什么 - 做: - 在线更新包命名为 `CMAutoBuy_<版本>.zip`。 - 完整便携包命名为 `自动采集采购工具_<版本>.zip`。 - 额外生成内容相同的最新版便携包别名 `自动采集采购工具.zip`,方便人工下载。 - 生成固定在线入口 `autobuy_manifest.json`。 - 同时生成内容相同的归档清单 `autobuy_manifest_<版本>.json`。 - Manifest 的 `update.file` 指向版本化更新包,`portable.file` 固定指向 `自动采集采购工具.zip`;文件名、大小和 SHA256 与实际文件一致。 - Client 默认更新地址改为固定 `autobuy_manifest.json`;保存过旧默认地址的本地设置自动迁移到新地址。 - Client 版本保持为 `0.1.0`。 - 不做: - 不改变发布目录内部 `Launcher.exe + app/ + data/` 结构。 - 不改变更新包内容、安全校验、认证、下次启动替换和回退逻辑。 - 不让 Client 直接读取带版本号的归档清单作为默认入口。 - 不改变 Admin 接口、SQLite 表结构、采购流程和真实下单开关。 ## 怎么做 - 修改 `client/packaging/build.ps1` 的 ZIP 与清单输出名称;版本化便携包先生成,固定别名使用复制,保证字节一致;Manifest 使用固定便携包别名。 - 修改 `client/build_tools/release_manifest.py` 的固定清单常量,并增加版本化清单命名函数。 - 修改 `client/src/update_service.py` 的默认清单 URL,保留旧默认 URL 常量供一次性配置迁移。 - 在更新事件装配时,只把完全匹配旧默认值的本地 URL 更新为新固定入口;用户自定义地址不改。 - 扩展打包、清单和配置迁移测试;同步 Client 上手指南、需求和质量基线中的文件名。 ## 验收标准 - [x] 构建生成 `CMAutoBuy_0.1.0.zip`,内部只包含 `app/`。 - [x] 构建生成 `自动采集采购工具_0.1.0.zip` 和 `自动采集采购工具.zip`,两者字节和 SHA256 相同。 - [x] 构建生成 `autobuy_manifest.json` 和 `autobuy_manifest_0.1.0.json`,两者内容相同。 - [x] Manifest 的 `update.file` 为 `CMAutoBuy_0.1.0.zip`,`portable.file` 为 `自动采集采购工具.zip`,大小和 SHA256 与实际 ZIP 一致。 - [x] Client 默认读取固定 `autobuy_manifest.json`,而不是版本化清单。 - [x] 旧默认清单地址自动迁移;用户自定义更新地址保持不变。 - [x] 文件名使用约定一致,在线更新文件名保持 ASCII,人工便携包使用中文名称。 - [x] 自动测试、构建和打包启动冒烟通过,真实服务器文件替换未验证部分明确记录。 - [x] 真实下单默认关闭,Admin 接口和采购流程未改变。 ## 怎么验证 从 `client/` 执行: ```powershell $env:QT_QPA_PLATFORM="offscreen" C:/Python310/python.exe -m pytest test -q --disable-warnings Remove-Item Env:QT_QPA_PLATFORM .\build_client.bat ``` 检查 `client/release/` 的文件名、两个清单内容、两个便携 ZIP 哈希和 Manifest 内的版本化 ZIP 哈希;最后离屏启动版本化发布目录。 ## 风险和回退 - 删除旧服务器清单前必须先上传新的固定清单和对应 ZIP;旧 Client 尚未升级���建议服务器暂时保留旧清单别名。 - 可整体回退本工单提交并恢复旧命名;发布目录内部和本地数据结构不变。
Author
Owner

实施完成,待用户验收

实现提交:240626f

完成内容:

  • 发布版本升级为 0.2.2,生成固定清单、版本化清单、版本化更新包及中英文便携包别名。
  • Client 默认地址切换到 autobuy_manifest.json,仅对完全匹配的旧默认地址执行迁移,用户自定义地址保持不变。
  • 真实 Windows PowerShell 构建时发现中文脚本编码会造成文件名乱码,已改为 Unicode 码点构造并重新构建验证。
  • 同步更新上手指南、需求基线、发布门禁和设置页地址示例。

验证结果:

  • 针对性测试:31 passed。
  • Client 全量测试:267 passed。
  • 打包测试复跑:10 passed。
  • build_client.bat 成功生成 0.2.2 全部约定产物。
  • 两个便携包字节一致;两个 Manifest 字节一致;Manifest 内 ZIP 大小和 SHA256 均与实际文件一致。
  • 更新包只包含 app/,不包含 data/。
  • 打包后的 Launcher.exe 离屏启动成功,运行程序版本为 0.2.2。

未验证:尚未把 0.2.2 文件上传真实发布服务器,也未从旧版 Client 完成一次真实在线升级。服务器切换时应先上传新 ZIP 和 autobuy_manifest.json,并暂时保留旧清单别名供旧 Client 使用。

## 实施完成,待用户验收 实现提交:`240626f` 完成内容: - 发布版本升级为 `0.2.2`,生成固定清单、版本化清单、版本化更新包及中英文便携包别名。 - Client 默认地址切换到 `autobuy_manifest.json`,仅对完全匹配的旧默认地址执行迁移,用户自定义地址保持不变。 - 真实 Windows PowerShell 构建时发现中文脚本编码会造成文件名乱码,已改为 Unicode 码点构造并重新构建验证。 - 同步更新上手指南、需求基线、发布门禁和设置页地址示例。 验证结果: - 针对性测试:31 passed。 - Client 全量测试:267 passed。 - 打包测试复跑:10 passed。 - `build_client.bat` 成功生成 0.2.2 全部约定产物。 - 两个便携包字节一致;两个 Manifest 字节一致;Manifest 内 ZIP 大小和 SHA256 均与实际文件一致。 - 更新包只包含 `app/`,不包含 `data/`。 - 打包后的 `Launcher.exe` 离屏启动成功,运行程序版本为 `0.2.2`。 未验证:尚未把 0.2.2 文件上传真实发布服务器,也未从旧版 Client 完成一次真实在线升级。服务器切换时应先上传新 ZIP 和 `autobuy_manifest.json`,并暂时保留旧清单别名供旧 Client 使用。
Author
Owner

归档已完成:

  • 归档文档:docs/task/102-client发布产物命名规范.md
  • 归档提交:870c95a

工单保持打开,等待用户验收;验收通过后再关闭并更新父工单 #1。

归档已完成: - 归档文档:`docs/task/102-client发布产物命名规范.md` - 归档提交:`870c95a` 工单保持打开,等待用户验收;验收通过后再关闭并更新父工单 #1。
Author
Owner

验收反馈调整

用户要求 Manifest 的便携包字段不要引用带版本号文件,改为:

  • update.file:仍为 CMAutoBuy_0.2.2.zip
  • portable.file:改为 自动采集采购工具.zip

版本化便携包 自动采集采购工具_0.2.2.zip 仍保留用于归档,两份便携包保持字节一致。本调整不改变更新下载、安全校验、应用替换或采购行为。验收项重新置为待验证。

## 验收反馈调整 用户要求 Manifest 的便携包字段不要引用带版本号文件,改为: - `update.file`:仍为 `CMAutoBuy_0.2.2.zip` - `portable.file`:改为 `自动采集采购工具.zip` 版本化便携包 `自动采集采购工具_0.2.2.zip` 仍保留用于归档,两份便携包保持字节一致。本调整不改变更新下载、安全校验、应用替换或采购行为。验收项重新置为待验证。
Author
Owner

版本范围确认

用户确认本任务版本保持为 0.1.0,不升级到 0.2.2。验收产物相应调整为:

  • CMAutoBuy_0.1.0.zip
  • 自动采集采购工具_0.1.0.zip
  • 自动采集采购工具.zip
  • autobuy_manifest.json
  • autobuy_manifest_0.1.0.json

Manifest 的 portable.file 固定为 自动采集采购工具.zip。

## 版本范围确认 用户确认本任务版本保持为 `0.1.0`,不升级到 0.2.2。验收产物相应调整为: - `CMAutoBuy_0.1.0.zip` - `自动采集采购工具_0.1.0.zip` - `自动采集采购工具.zip` - `autobuy_manifest.json` - `autobuy_manifest_0.1.0.json` Manifest 的 `portable.file` 固定为 `自动采集采购工具.zip`。
Author
Owner

验收反馈已实现

实现提交:4dbe519
归档更新提交:ba6710a

最终结果:

  • 版本保持为 0.1.0。
  • Manifest 的 update.file 为 CMAutoBuy_0.1.0.zip。
  • Manifest 的 portable.file 为 自动采集采购工具.zip,不带版本号。
  • 自动采集采购工具_0.1.0.zip 仍作为归档文件保留,且与固定便携包字节一致。
  • 固定与版本化 Manifest 内容一致,文件大小和 SHA256 与其实际引用文件一致。

验证:

  • 针对性测试:31 passed。
  • Client 全量测试:267 passed。
  • build_client.bat 实际构建成功。
  • 更新包只包含 app/。
  • 打包 Launcher 离屏启动成功,文件版本为 0.1.0。

归档:docs/task/102-client发布产物命名规范.md

工单保持打开,等待用户最终验收。

## 验收反馈已实现 实现提交:`4dbe519` 归档更新提交:`ba6710a` 最终结果: - 版本保持为 `0.1.0`。 - Manifest 的 `update.file` 为 `CMAutoBuy_0.1.0.zip`。 - Manifest 的 `portable.file` 为 `自动采集采购工具.zip`,不带版本号。 - `自动采集采购工具_0.1.0.zip` 仍作为归档文件保留,且与固定便携包字节一致。 - 固定与版本化 Manifest 内容一致,文件大小和 SHA256 与其实际引用文件一致。 验证: - 针对性测试:31 passed。 - Client 全量测试:267 passed。 - `build_client.bat` 实际构建成功。 - 更新包只包含 `app/`。 - 打包 Launcher 离屏启动成功,文件版本为 0.1.0。 归档:`docs/task/102-client发布产物命名规范.md` 工单保持打开,等待用户最终验收。
Author
Owner

用户已于 2026-08-11 明确验收通过。

  • 本地归档状态已更新为“已完成,用户验收通过”
  • 验收记录提交:eca9289
  • 本工单按项目流程关闭
用户已于 2026-08-11 明确验收通过。 - 本地归档状态已更新为“已完成,用户验收通过” - 验收记录提交:`eca9289` - 本工单按项目流程关闭
ila closed this issue 2026-08-11 10:58:25 +08:00
Sign in to join this conversation.
No labels
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: chengma/cmautobuy#102