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

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


当前回答

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

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

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

其他回答

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

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

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

以下是我用于主要升级的语法:

<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>

正如@Brian Gillespie指出的,根据所需的优化,还有其他地方可以安排RemoveExistingProducts。注意,PUT-GUID-HERE必须相同。

我正在使用最新版本的WiX(3.0),无法使上述工作。但这确实起作用了:

<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>

注意,PUT-GUID-HERE应该与您在产品的UpgradeCode属性中定义的GUID相同。

我阅读了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”参数,但它并没有说这些参数在大升级中是禁止的——它们只是停止工作。所以你不应该在重大升级时使用它们。

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

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