如何实施WiX安装程序升级?

时间:2020-03-06 14:31:59  来源:igfitidea点击:

在工作中,我们使用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在当前安装中处理&lt;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"
    />