27

每当开发人员签入更改时,我都会让 CI 构建系统构建一个 MSI。我们在已安装的 MSI 上运行自动化验收测试。

基本上每个 MSI 都是产品的完整安装,因此我们本身没有任何版本控制(ala Windows 安装程序)。

每个 MSI 具有相同的产品 G​​UID 和升级 GUID,以及相同的版本号。但具有不同的包 GUID(在 wix 中使用“*”)。

我想要实现的是,当安装程序运行时,它将“卸载”任何以前安装的产品版本,并安装新版本..全部来自单个 MSI(我们有一个复杂的安装过程,这是我们无法控制的.. citrix 和 sccm,所以我们想给他们一个简单的安装路径)

我试过了:

<Property Id='PREVIOUSVERSIONSINSTALLED' Secure='yes' />
<Upgrade Id='$UPGRADE_GUID'>  
  <UpgradeVersion Minimum='1.0.0.0'
                  Maximum='99.0.0.0'
                  Property='PREVIOUSVERSIONSINSTALLED'
                  IncludeMinimum='yes'
                  IncludeMaximum='no' />
</Upgrade>

并且有:

<InstallExecuteSequence>
  <RemoveExistingProducts After='InstallFinalize' />
</InstallExecuteSequence>

并尝试过:

<InstallExecuteSequence>
  <RemoveExistingProducts After='InstallInitialize' />
</InstallExecuteSequence>

但是,当我尝试从后续版本安装 msi 时,我得到:

Another version of this product is already installed. Installation of this version cannot continue. 
To configure or remove the existing version of this product, use Add/Remove Programs on the Control Panel. 

这不是我真正想要的..

我知道我可以只更新产品标签中的版本属性,但这变得难以管理。首先,我每天可以生成 20 多个 msi 构建,因为我有许多生成 MSI 的构建管道,并且不确定如何以有意义的方式处理版本编号。

也许 Windows Installer 只是不允许这种类型的“总是覆盖已安装的版本”安装?

4

4 回答 4

28

所以我确实找到了一种不改变版本号的方法。

我在每次构建时更改产品 GUID,但保持升级 GUID 相同。

我还必须将 RemoveExistingProducts 更改为 Before='InstallInitialize'。否则,它只会在安装路径中的构建之间留下“增量”。

正如下面 Wim 所指出的,我可以将生成的产品 G​​UID 替换为'*'.

于 2012-07-31T07:16:12.277 回答
26

您可以使用此代码删除旧版本并安装新版本:

<Product Id="*"
         UpgradeCode="87795f3dc95-81f5-473e-955e-2871a5bd66a5"
         Name="AppName"
         Language="1033"
         Version="1.0.6"
         Manufacturer="Manufacturer Name">
  <Package InstallerVersion="200" Compressed="yes" InstallScope="perMachine" />
  <MajorUpgrade Schedule="afterInstallInitialize"
                DowngradeErrorMessage="A later version of [ProductName] is already installed"
                AllowSameVersionUpgrades="yes" />
</Product>
于 2014-12-24T12:42:03.007 回答
6

尝试

<InstallExecuteSequence>
  <RemoveExistingProducts After='InstallFinalize' />
</InstallExecuteSequence>

这应该会在安装完成后删除所有现有产品,尽管您可以自定义执行此操作的点

http://mohundro.com/blog/2009/02/23/getting-started-with-wix-and-major-upgrades/

另请参阅此问题的已接受答案

于 2012-07-31T03:42:18.183 回答
4

如果产品代码和版本相同但包代码不同,您将始终收到该 Windows Installer 错误消息。

我强烈建议在 CI 构建中包含安装程序的版本信息。如果您正在安装并随后升级每个构建,那么版本控制并不是一件坏事。将它添加到 CI 构建中应该相对容易。

于 2012-07-31T04:22:03.057 回答