我有一个CI构建系统,每当开发人员检查更改时,就会构建一个MSI。我们在安装的MSI上运行自动化验收测试。
基本上,每个MSI都是产品的完整安装包,因此我们没有任何版本控制(类似于Windows Installer)。
每个MSI具有相同的产品GUID和升级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根本不允许这种“始终覆盖已安装版本”的安装方式?