7.8 KiB
恒诺迁移工具构建与发版说明
本文是 henlo_migration_wpf10/ 的构建、Velopack 打包、更新服务器部署和客户端自动更新说明。涉及版本、发布或更新的任务必须先完整读取本文;若本文与实际代码冲突,以 .csproj、pack.bat 和 App.xaml.cs 为准,并同步更新本文。
权限边界
- 普通 Debug/Release 构建可以用于本地验证。
- 修改版本号、运行
pack.bat、删除或覆盖发布产物、上传更新服务器都属于显式发布动作,必须有用户当前任务的明确授权。 - 打包脚本不会上传任何文件;服务器部署是独立的外部写操作,需要另行授权。
- 不要把“项目构建成功”描述成“发版成功”或“自动更新已验证”。
版本来源
- 唯一版本来源是
henlo_migration_wpf10/henlo_migration_wpf10.csproj的<Version>。 - 正式发版前必须把版本号单调递增,不要重新打包已存在的版本号。
- 程序显示版本来自程序集元数据,不在脚本或文档中另设版本常量。
日常构建
在仓库根目录执行:
dotnet restore .\henlo_migration_wpf10\henlo_migration_wpf10.csproj
dotnet build .\henlo_migration_wpf10\henlo_migration_wpf10.csproj -c Debug
依赖已经恢复且不希望访问包源时:
dotnet build .\henlo_migration_wpf10\henlo_migration_wpf10.csproj -c Debug --no-restore
Debug 产物位于 henlo_migration_wpf10/bin/Debug/net10.0-windows/,只用于开发验证,不是 Velopack 发布包。项目现有 CS8632 和 NU1701 警告不等于构建错误,但不得新增编译错误。
正式打包流程
唯一正式入口:
cd .\henlo_migration_wpf10
.\pack.bat
pack.bat 当前执行顺序:
-
从
.csproj读取<Version>。 -
删除并重建
publish/。 -
执行:
dotnet publish henlo_migration_wpf10.csproj -c Release -o publish --self-contained false -r win-x64 -
删除
publish/config.ini,确保本机数据库配置不会进入产物。 -
确保
publish/data/、publish/data/from/、publish/pre/存在。 -
执行:
vpk pack -u henlo_migration -v <Version> -p publish -e "恒诺迁移工具.exe" -o releases --noInst -
保留
releases/中的历史包,供 Velopack 生成差量包;脚本只清理publish/,不会清理releases/。
打包依赖 Windows、对应 .NET SDK、可调用的 dotnet 和 vpk。不要使用 _build*、_make_pack.bat、_write_pack.ps1 等历史辅助文件作为正式入口。
当前发布形态
- 目标平台:Windows x64。
- 发布方式:framework-dependent,
--self-contained false;目标机器需要匹配的 .NET 10 Desktop Runtime。 - Velopack 参数包含
--noInst,因此不生成 Setup 安装器,只生成便携包和更新源文件。 Properties/PublishProfiles/FolderProfile.pubxml虽配置PublishSingleFile=true,但pack.bat没有使用该 Profile;正式产物不是单文件,会包含 EXE、DLL 和 runtimeconfig/deps 文件。
运行时文件进入发布包的规则
.csproj只复制pre/*.txt|*.fnc|*.prc等程序辅助脚本,不复制本机config.ini或data/from/*.txt;pack.bat还会在打包前再次删除publish/config.ini,并创建空的data/from/目录。pre/hmig_get_table_bos_31.prc、pre/hmig_get_table_bos_field_31.prc等运行时辅助过程必须出现在发布输出中。- 新安装的索引列表为空;程序添加第一条对应配置时会在
data/from/创建table.txt、bos.txt、bos_field.txt、prc.txt或data.txt。 - 新安装首次运行时会在 Velopack 根目录(与
Update.exe同级)创建值为空的config.ini;普通未打包运行时仍在程序目录创建。不得把真实或样例账号密码放入发布产物。
Velopack 产物
正常情况下 releases/ 至少包含:
henlo_migration-win-Portable.zip
henlo_migration-<Version>-full.nupkg
henlo_migration-<Version>-delta.nupkg
RELEASES
releases.win.json
assets.win.json
便携 ZIP 内应包含 .portable、根启动器、Update.exe、current/ 应用文件以及需要的 data/、pre/ 内容。差量包是否生成取决于 releases/ 中是否有可用的历史版本。
更新服务器部署
客户端更新地址硬编码在 App.xaml.cs:
http://zjhenlo.henlo.net:8878/henlo_migration/auto_update/
当前没有自动上传脚本。获得上传授权后,应部署并核对:
- 新版本 full nupkg;
- 新版本 delta nupkg(若生成);
RELEASES;releases.win.json;assets.win.json;- 需要提供便携下载时再上传
henlo_migration-win-Portable.zip。
上传后至少验证服务器能直接访问元数据文件和其中引用的包,文件大小及版本号与本地产物一致。不要只上传 nupkg 而遗漏更新后的元数据。
客户端自动更新流程
App.xaml.cs 当前行为:
- UI 启动前注册
OnAfterUpdateFastCallback并调用VelopackApp.Build().Run()。 - 从旧版更新时,更新器替换
current/后会先调用新程序的快速回调;此时旧current/仍保存在packages/VelopackTemp/tmp_*,程序从中把旧config.ini迁移到 Velopack 根目录。 - 从系统临时目录恢复上次更新前备份的
config.ini、data/、pre/。 - 创建指向更新服务器的
UpdateManager;非 Velopack 环境创建失败时禁用自动更新。 - 后台静默检查并下载更新;手动“检查更新”使用相同更新源。
- 用户同意立即重启时,先备份持久目录中的
config.ini以及current/下的data/、pre/,再调用ApplyUpdatesAndRestart()。 - 新版本首次启动时恢复备份并删除临时备份目录。
当前限制和未验证项:
config.ini必须位于 Velopack 根目录,不能重新放回会被整体替换的current/。旧版本首次升级依赖OnAfterUpdateFastCallback在更新器清理旧目录前完成迁移;迁移异常记录到根目录的config_migration.log。- 更新备份范围包含持久目录中的
config.ini以及current/中的data/、pre/;恢复失败时会记录到error.log,发版验收仍需验证用户配置未丢失。 - 用户下载完成后选择“不立即重启”时,代码没有明确实现下次启动自动应用已下载更新的流程。
- 直接运行普通
publish/中的 EXE 时通常不属于 Velopack 安装态,程序会禁用更新或把检查异常写入error.log。 --noInst生成的是便携模式;便携包的检查、下载、应用和重启更新链路尚未完成实际端到端回归,不能声称自动更新可靠可用。
发版验收清单
- 确认工作区改动和准备发布的提交范围,避免把无关或敏感文件带入。
- 递增并核对
.csproj版本号。 - 先执行主项目构建,确保
0个错误。 - 获得明确授权后运行
pack.bat,确认 publish 和 vpk 两阶段都成功。 - 检查便携 ZIP、full/delta 包、
RELEASES和两个 JSON 的版本、大小及时间。 - 检查发布包中的
pre/和必要运行文件,并确认产物中不存在config.ini及开发机data/from/*.txt。 - 在未安装态测试普通 EXE/便携包启动;若任务涉及自动更新,再在对应 Velopack 运行形态下单独验证更新。
- 使用旧版便携目录写入不含真实凭据的标记配置,应用新版 full 包,确认标记配置已从旧
current/config.ini迁移为根目录config.ini,且新版再次启动不会覆盖。 - 只有获得上传授权后才能部署服务器;上传后验证 URL 和包完整性。
- 交付说明必须区分:构建验证、打包验证、便携运行验证、自动更新验证和服务器部署验证。