[译]:WiX Toolset使用技巧——实现安装包重要升级
博客分类: 官方教程
返回目录索引
原文地址:Implement a Major Upgrade In Your Installer
译文地址:WiX Toolset使用技巧——实现安装包重要升级
How To: Implement a Major Upgrade In Your Installer
在我们创建基于.msi的安装程序时,强烈建议在Windows安装程序中添加支持重要升级的逻辑。重要升级是.msi最常见的更新形式,并且在初始.msi版本中提供 支持的话,可以使得你在未来获得更大的灵活性。如果没有针对主要升级的支持,那么如果你以后需要发布更新,这将会大大增加你分发软件的复杂性。关于Windows安装程序的重要升级其他内容可以参见:Major Upgrades —— 微软英文文档
你可以按照以下步骤学习如何在.msi中启用重要升级,如何生成多个.msi版本,并使用它们测试重要升级方案。
步骤1:添加版本升级所需的信息
为了允许重要升级,你需要在.msi中包含以下几个信息:
为产品添加唯一ID,以此标识产品可以升级
要完成此操作,你需要在Product元素中添加UpgradeCode属性。如下所示:
<Product Id="*"
UpgradeCode="PUT-GUID-HERE"
Name="My Application Name"
Language="1033"
Version="1.0.1"
Manufacturer="My Manufacturer Name"/>
删除旧版本以及处理乱序安装
MajorUpgrade元素将升级所有旧版本的.msi。默认情况下,它可以防止乱序安装:在安装新版之后安装旧版。
MajorUpgrad元素参考:原文:MajorUpgrade Element
<MajorUpgrade
DowngradeErrorMessage="A later version of [ProductName] is already installed. Setup will now exit.">
有几个选项控制在哪些地方执行RemoveExistingProducts操作来移除旧版的.msi。你需要查看选项内容,并选择最适合的选项。关于选项内容可以参阅:原文:RemoveExistingProducts Action;原文:RemoveExistingProducts Element。
默认情况下,MajorUpgrade是在InstallValidate之后执行RemoveExistingProducts。你可以使用Schedule属性更改计划。例如,如果你选择在InstallInitialize之后执行它,代码配置如下:
<MajorUpgrade
Schedule="afterInstallInitialize"
DowngradeErrorMessage="A later version of [ProductName] is already installed. Setup will now exit.">
Windows安装程序会在FindRelatedProducts操作期间查找具有相同UpgradeCode值的其他已安装的.msi文件。如果你没有在你的安装代码中指定FindRelatedProducts操作,WiX在创建.msi时会自动安排它。
步骤2:构建.msi —— 版本1和2 —— 用于测试
创建版本1的.msi与运行标准构建过程一样 —— 使用WiX toolset编译链接它。而创建版本2的.msi必须进行以下内容调整设置,然后再重新运行构建过程来创建新的.msi:
- 增加Product元素中的版本号,要比以前发布的任何版本都高。Windows安装在升级方案中仅使用版本的前3个部分,因此确保增加你的版本 —— 前3个部分中的一个高于任何之前发布的版本。例如,如果你版本1使用版本号1.0.1.0,则版本2中应该使用1.0.2.0或更高版本(1.0.1.1在此处不起作用)
注意:经测试,如果你使用版本号最后一位作为升级标识,要么安装不上,要么就是安装后出现两个版本,无法正确升级。
- 在.msi的新版本的Product元素中生成新的Id值。
步骤3:在发布版1之前测试升级方案
这个步骤很重要,但常常会被忽略。为了确保升级方案可行(符合要求),你应该在发布第一版的.msi之前测试升级。如果有一些与升级相关的错误,可以通过版本2或更高版本的.msi来进行修复,但是如果有影响版本1的卸载的错误,则必须在发布版本1之前修复。一旦版本1发布,你基本上就锁定了与版本1一起发布的卸载行为,并且这会影响重要升级方案,因为Windows 安装程序在执行 版本2安装之前需要卸载版本 1。
这里有些有趣的场景测试:
- 先安装版本1,后安装版本2.确保版本1正确删除,版本2正常工作。确保版本2在之后可以完全卸载干净。
- 先安装版本2,然后尝试安装版本1。确保版本1检测到版本2安装,并且阻止或静默退出 —— 具体取决于你为乱序安装方案选择的执行行为。
在测试重要升级的场景中,你需要特别注意.msi中的自定义操作条件,因为自定义操作可能在重要更新的卸载操作中带来问题,并且可能导致你的产品只能部分安装。UPGRADINGPRODUCTCODE属性可用于防止由RemoveExistingProducts操作调用的卸载中操作。
另外,请注意需要安装到GAC或Win32 WinSXS存储的程序集。关于重大升级中移除GAC和WinSXS存储中的程序集的事件序列信息见:使用 Windows 安装程序程序包执行重大升级后缺少程序集在全局程序集缓存或 SxS
译:奇葩史