如何制作仅更新exe与chm、不覆盖许可的通用Wix小升级安装包
Wix 多用户专属许可安装包通用升级方案
以下是两种适配场景的可行方案,按实施复杂度从低到高排序:
方案1:轻量级独立升级MSI(最快落地,完全适配当前场景)
无需改动原有MSI生成逻辑,也不需要研究MSP补丁规则,所有用户共用同一个升级包:
- 核心逻辑:做一个仅包含新版exe、chm文件的小型MSI,安装时自动读取原程序的安装路径,仅覆盖两个通用文件,完全不涉及许可文件的操作
- 关键实现步骤:
- 读取原程序写入的注册表
Uninstall节点的InstallLocation值,获取实际安装路径(所有用户的MSI除许可文件外,产品注册表信息、安装路径规则都是统一的,可直接通用读取逻辑) - 增加安装前置校验:仅当检测到原安装路径存在时允许运行升级包,避免误装
- 读取原程序写入的注册表
- Wix 实现参考代码:
<!-- 读取原程序的安装路径 --> <Property Id="ORIGIN_INSTALL_PATH"> <RegistrySearch Id="SearchOriginInstallPath" Root="HKLM" Key="SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{你的原产品固定UpgradeCode}" Name="InstallLocation" Type="directory" /> </Property> <!-- 安装前置校验 --> <Condition Message="未检测到原程序安装,请先安装正式版本后再运行升级包"> ORIGIN_INSTALL_PATH AND NOT REMOVE="ALL" </Condition> <!-- 定义要更新的文件,直接写入原安装路径 --> <Directory Id="TARGETDIR" Name="SourceDir"> <Directory Id="ORIGIN_INSTALL_PATH"> <Component Id="Update_Exe" Guid="*"> <File Id="New_App_Exe" Source="本地新版exe路径\你的程序名.exe" KeyPath="yes" /> </Component> <Component Id="Update_Chm" Guid="*"> <File Id="New_Help_Chm" Source="本地新版chm路径\你的帮助文档名.chm" KeyPath="yes" /> </Component> </Directory> </Directory> <!-- 安装功能定义 --> <Feature Id="Update_Feature" Title="程序通用升级包" Level="1"> <ComponentRef Id="Update_Exe" /> <ComponentRef Id="Update_Chm" /> </Feature>
- 验证提示:打包完成后可先在测试环境验证,确认许可文件不会被修改、两个通用文件成功替换后再批量分发。
方案2:拆分安装包结构(适合长期迭代)
如果后续还有多次版本更新,可一次调整原有MSI生成逻辑,彻底解决升级繁琐问题:
- 将原安装包拆为两个独立MSI:
- 基础运行包:所有用户完全统一,仅包含exe、chm通用文件,固定UpgradeCode和版本号
- 许可授权包:每个用户专属,仅包含许可文件,安装时校验基础包已安装才可运行
- 后续版本更新只需要发布基础运行包的升级版本,所有用户都可以直接用同一个升级包安装,完全不会触碰许可文件。
避坑说明
无需浪费时间研究MSP补丁制作规则,MSP要求必须匹配原MSI的包码、文件结构,当前场景下每个用户原MSI都不同,MSP补丁完全无法通用。
内容的提问来源于stack exchange,提问作者Bill Heitler
相关产品推荐
相关产品推荐

