如何实施WiX安装程序升级?
在工作中,我们使用WiX来构建安装包。我们希望产品X的安装将导致在该计算机上卸载该产品的先前版本。
我已经在Internet上的多个地方阅读过有关重大升级的信息,但无法使其正常工作。
任何人都可以指定将卸载早期版本功能添加到WiX所需的确切步骤吗?
解决方案
最终,我找到了一个解决方案,然后在这里发布给其他可能遇到相同问题的人(我们中的全部5个人):
- 将产品ID更改为*
- 在产品下添加以下内容:
<Property Id="PREVIOUSVERSIONSINSTALLED" Secure="yes" /> <Upgrade Id="YOUR_GUID"> <UpgradeVersion Minimum="1.0.0.0" Maximum="99.0.0.0" Property="PREVIOUSVERSIONSINSTALLED" IncludeMinimum="yes" IncludeMaximum="no" /> </Upgrade>
- 在InstallExecuteSequence下添加:
<RemoveExistingProducts Before="InstallInitialize" />
从现在开始,每当我安装产品时,它都会删除以前的安装版本。
注意:用我们自己的GUID替换升级ID
我们最好在WiX用户的邮件列表中询问此问题。
WiX最好与Windows Installer的工作有深刻的了解而使用。我们可能会考虑获取" Windows安装程序权威指南"。
删除现有产品的操作是RemoveExistingProducts操作。因为这样做的后果取决于计划的时间,即故障是否导致旧产品的重新安装以及是否再次复制未更改的文件,所以我们必须自己计划它。
RemoveExistingProducts
在当前安装中处理<Upgrade>
元素,将@@属性与系统上所有已安装产品的UpgradeCode
(在<Product>`元素中指定)相匹配。 " UpgradeCode"定义了一系列相关产品。所有具有此UpgradeCode的产品,其版本均在指定范围内,并且UpgradeVersion / @ OnlyDetect属性为no(或者被忽略)的产品将被删除。
RemoveExistingProducts
的文档提到设置UPGRADINGPRODUCTCODE
属性。这意味着要删除的产品的卸载过程会收到该属性,该属性的值是要安装的产品的" Product / @ Id"。
如果原始安装不包含" UpgradeCode",则将无法使用此功能。
我使用此站点来帮助我了解有关WiX升级的基础知识:
http://wix.tramontana.co.hu/tutorial/upgrades-and-modularization
之后,我创建了一个示例安装程序(安装了一个测试文件),然后创建了升级安装程序(安装了两个示例测试文件)。这将使我们对机制的工作原理有基本的了解。
正如Mike在Apress的书" Windows安装程序权威指南"中所说的那样,它可以理解,但是它不是使用WiX编写的。
另一个非常有用的站点是:
http://www.wixwiki.com/index.php?title=Main_Page
Product元素内的Upgrade元素与正确的操作计划相结合,将执行我们要执行的卸载操作。确保列出要删除的所有产品的升级代码。
<Property Id="PREVIOUSVERSIONSINSTALLED" Secure="yes" /> <Upgrade Id="00000000-0000-0000-0000-000000000000"> <UpgradeVersion Minimum="1.0.0.0" Maximum="1.0.5.0" Property="PREVIOUSVERSIONSINSTALLED" IncludeMinimum="yes" IncludeMaximum="no" /> </Upgrade>
请注意,如果我们对构建感到谨慎,则可以防止人们意外地安装较新版本的产品。这就是"最大值"字段的作用。在构建安装程序时,我们将UpgradeVersion Maximum设置为正在构建的版本,但是将IncludeMaximum =" no"设置为防止这种情况。
我们可以选择安排RemoveExistingProducts的时间。我更喜欢在InstallFinalize之后进行调度(而不是像其他人建议的那样在InstallInitialize之后进行调度):
<InstallExecuteSequence> <RemoveExistingProducts After="InstallFinalize"></RemoveExistingProducts> </InstallExecuteSequence>
这将保留产品的先前版本,直到复制新文件和注册表项之后。这使我可以将数据从旧版本迁移到新版本(例如,我们已将用户首选项的存储从注册表切换到XML文件,但是我们要保持礼貌并迁移其设置)。此迁移是在InstallFinalize之前以延迟的自定义操作完成的。
<Product Id="*" UpgradeCode="PUT-GUID-HERE" Version="$(var.ProductVersion)"> <Upgrade Id="PUT-GUID-HERE"> <UpgradeVersion OnlyDetect="yes" Minimum="$(var.ProductVersion)" Property="NEWERVERSIONDETECTED" IncludeMinimum="no" /> <UpgradeVersion OnlyDetect="no" Maximum="$(var.ProductVersion)" Property="OLDERVERSIONBEINGUPGRADED" IncludeMaximum="no" /> </Upgrade> <InstallExecuteSequence> <RemoveExistingProducts After="InstallInitialize" /> </InstallExecuteSequence>
<Product Id="*" UpgradeCode="PUT-GUID-HERE" ... > <Upgrade Id="PUT-GUID-HERE"> <UpgradeVersion OnlyDetect="no" Property="PREVIOUSFOUND" Minimum="1.0.0.0" IncludeMinimum="yes" Maximum="99.0.0.0" IncludeMaximum="no" /> </Upgrade>
<MajorUpgrade AllowDowngrades="no" DowngradeErrorMessage="!(loc.NewerVersionInstalled)" AllowSameVersionUpgrades="no" />