06-成品-Windows双形态安装包构建法
一、适用场景
把一个服务端/客户端整体交付为 Windows 上可双击安装的包,并同时提供两种形态:
安装向导(自动启动、有快捷方式与卸载项)与 便携版(解压到自选目录、手动启动)。
本例为 HFMS 其它 PC 服务端(含 GB 级资源目录)。
二、操作步骤
- 先打基础 zip:用构建脚本从源直读打
zip(含start.bat/stop.bat、app/、data/、资源目录、迁移工具)。
路径占位(<<ROOT>>)在目标机首次启动时按解压位置自适应替换。 - 便携版(7z 自解压 EXE):
7z a -sfx"C:/Program Files/7-Zip/7z.sfx" 便携版.exe <暂存目录>/*
采用扁平布局(解压即出app/、data/、start.bat)。它是纯解压型,解压后需手动双击start.bat。 - 安装向导(Inno Setup):在
.iss中设置——
DefaultDirName={localappdata}\HFMS、PrivilegesRequired=lowest、
[Run]用nowait postinstall自动跑start.bat、[Icons]加开始菜单与桌面快捷方式、
SetupIconFile+VersionInfo*嵌程序图标与版本信息;用ISCC.exe编译。 - .bat 入包前规范化:源 UTF-8 → GBK(936) + CRLF + 去掉
chcp行(否则目标机中文乱码/解析错乱)。 - 控体积:Inno 单
Setup.exe上限 ~4.2GB(Windows 限制),必须Compression=lzma2+SolidCompression=yes。 - 嵌图标:Inno 走
SetupIconFile;7z 便携版需先用rcedit给7z.sfx打图标与版本信息再作 sfx 桩重建。
三、注意边界
- 7z 自解压 ≠ 自动启动:
7z.sfx是纯解压模块,不能在解压后执行命令;要"装完自动启动"必须走 Inno。 - Inno 未捆绑中文
ChineseSimplified.isl时向导为英文,不影响自动启动功能。 - 便携版无快捷方式、无卸载项;安装向导写入「程序和功能」可干净卸载。
- 目标机须先装 Python 3.13(勾选 Add python.exe to PATH)。
- 两种形态内含文件完全一致、运行行为一致,只是分发体验不同;zip 基础包仍可作精简分发。
四、反例避雷
- ✗ 指望 7z 自解压 EXE 解压后自动运行 → 不可行(7-Zip 26.04 起
7z.sfx已不含RunProgram)。 - ✗ Inno 用
Compression=none直接装 5.2GB → 超 4.2GB 上限直接中断;必须lzma2。 - ✗
LZMABlockSize=256M语法非法 → 删去,用默认。 - ✗
.bat保留 UTF-8 / 纯 LF / 中途chcp→ cmd 中文解析错乱。 - ✗ Git Bash 里给
7z传C:/...参数会被篡改成 PortableGit 前缀路径 → 用MSYS_NO_PATHCONV=1,或改用 D: 盘路径。 - ✗ bat 里含
(x86)的路径未经保护 → cmd 把括号当代码块闭合报 "was unexpected at this time"。
修法:先set赋变量(set 引号值安全),再dir "变量路径" >nul 2>&1 && ...;echo也要echo 路径:"%VAR%"。 - ✗ 图标只放进包里、没嵌进 PE 资源 → 资源管理器不显示。用
ctypes枚举RT_GROUP_ICON复核;
注意 64 位下LoadLibraryExW必须显式设restype=HMODULE,否则 HMODULE 高位截断造成假阴性。
五、代码锚点 / 实战战绩
锚点:
- 程序源代码/deploy/pc-server/build_pc_server.py(--slim / --db / --out)
- 程序源代码/deploy/pc-server/hfms-pc-server-installer.iss
- 程序源代码/deploy/pc-server/pkgroot/{start.bat,stop.bat,README_PC服务端.md}
- 程序源代码/deploy/pc-server/_sfx_staging/(7z 暂存)
- 产物:PC服务器端/HFMS其它PC服务端安装向导_20261015.exe、HFMS其它PC服务端便携版_20261015.exe
战绩:
- 2026-10-15 产出 3.70GB 安装向导(自动启动 + 开始菜单/桌面快捷方式 + 卸载项)与 3.81GB 便携版。
- 图标经 ctypes 复核:安装向导 RT_GROUP_ICON=MAINICON ✅、便携版 id=1 ✅,均已嵌入 PE。
- 中文命名归档至 PC服务器端/,源目录无 .exe 残留。
六、关联笔记
- 与
06-成品-群晖SPK打包与格式排查法并列:同一产品的三条分发路线(群晖 SPK / Windows 双 EXE / zip 基础包)。 - 与
06-成品-部署与开机自启SOP互补(安装形态 vs 常驻自启)。 - 体积超限的通用解法与 SPK 一致:先找出占绝对比例的静态资源,能外置就外置。
七、版本记录
- v1.0(2026-10-16):首版。含双形态构建、.bat 规范化、体积上限、路径括号与图标校验坑。