在工作中,我们使用WiX来构建安装包。我们希望产品X的安装会导致该机器上该产品以前版本的卸载。

我已经在互联网上的几个地方读到一个重大升级,但不能让它工作。 任何人可以指定我需要采取的确切步骤,以添加卸载以前版本的功能到WiX?


当前回答

我阅读了WiX文档,下载了示例,但在升级时仍然有很多问题。次要升级不执行以前产品的卸载,尽管有可能指定这些卸载。我花了一天多的时间进行调查,发现WiX 3.5引入了一个用于升级的新标签。用法如下:

<MajorUpgrade Schedule="afterInstallInitialize"
        DowngradeErrorMessage="A later version of [ProductName] is already installed. Setup will now exit." 
        AllowDowngrades="no" />

但是问题的主要原因是文档中说要在小升级和小升级中使用“重装=ALL REINSTALLMODE=vomus”参数,但它并没有说这些参数在大升级中是禁止的——它们只是停止工作。所以你不应该在重大升级时使用它们。

其他回答

您最好在WiX-users邮件列表中询问这个问题。

WiX最好在充分理解Windows安装程序的情况下使用。你可以考虑获得“Windows安装程序权威指南”。

删除现有产品的操作是RemoveExistingProducts操作。因为它所做的事情的结果取决于它的计划位置——即,失败是否导致旧产品重新安装,以及是否再次复制未更改的文件——您必须自己计划它。

RemoveExistingProducts processes <升级当前安装中的>元素,将@Id属性匹配到系统上所有已安装产品的UpgradeCode(在<Product>元素中指定)。UpgradeCode定义了一系列相关产品。任何具有此UpgradeCode的产品,其版本落在指定的范围内,且UpgradeVersion/@OnlyDetect属性为no(或省略),将被删除。

RemoveExistingProducts的文档提到了设置UPGRADINGPRODUCTCODE属性。这意味着要移除的产品的卸载过程接收到该属性,其值是正在安装的产品的product /@Id。

如果您的原始安装不包括升级码,您将无法使用此功能。

我使用这个网站来帮助我了解有关WiX升级的基础知识:

http://wix.tramontana.co.hu/tutorial/upgrades-and-modularization

之后,我创建了一个示例安装程序(安装了一个测试文件),然后创建了升级安装程序(安装了2个示例测试文件)。这将使你对该机制的工作原理有一个基本的了解。

正如Mike在Apress的书中所说,“Windows安装程序的权威指南”,它会帮助你理解,但它不是用WiX写的。

另一个非常有用的网站是这个:

http://www.wixwiki.com/index.php?title=Main_Page

最后我找到了一个解决方案——我把它贴在这里,给其他可能有同样问题的人(你们5个人):

将产品ID更改为* 产品下添加以下内容: <Property Id="PREVIOUSVERSIONSINSTALLED" Secure="yes" /> <升级Id = " YOUR_GUID " > < UpgradeVersion 最大最小= " 1.0.0.0 " = " 99.0.0.0 " 属性= " PREVIOUSVERSIONSINSTALLED " IncludeMinimum="yes" IncludeMaximum="no" /> > < /升级 在InstallExecuteSequence下添加: <RemoveExistingProducts Before="InstallInitialize" />

从现在开始,每当我安装产品,它删除以前安装的版本。

注意:请将升级Id替换为自己的GUID

在最新版本(从3.5.1315.0 beta开始)中,您可以使用MajorUpgrade元素,而不是使用您自己的元素。

例如,我们使用这段代码进行自动升级。它可以防止降级,给出一个本地化的错误消息,也可以防止升级已经存在的相同版本(即只升级低版本):

<MajorUpgrade
    AllowDowngrades="no" DowngradeErrorMessage="!(loc.NewerVersionInstalled)"
    AllowSameVersionUpgrades="no"
    />

这对我来说很管用,即使我的主要成绩是DOWN:

<Wix ...>
  <Product ...>
    <Property Id="REINSTALLMODE" Value="amus" />
    <MajorUpgrade AllowDowngrades="yes" />