我有CI构建系统在开发人员检查更改时构建MSI。我们对已安装的MSI进行自动验收测试。
基本上每个MSI都是产品的完整安装,因此我们本身没有任何版本控制(ala Windows安装程序)..
每个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.
这不是我想要的......
我知道我只能更新产品标签中的Version属性,但这很难管理。首先,我可以每天生成20多个msi版本,因为我有许多生成MSI的构建管道,并且不确定如何以有意义的方式处理版本编号。
也许Windows Installer不允许这种类型的“始终覆盖安装版本”安装?
答案 0 :(得分:19)
所以我确实找到了一种方法,无需更改版本号。
我更改了每次构建的产品GUID,但保持升级GUID相同。
我还必须将RemoveExistingProducts更改为Before ='InstallInitialize'。否则它只在安装路径中的构建之间留下“增量”。
如下面的Wim所述,我可以将生成的产品GUID替换为'*'
。
答案 1 :(得分:10)
您可以使用此代码删除旧版本并安装较新版本:
<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>
答案 2 :(得分:4)
试
<InstallExecuteSequence>
<RemoveExistingProducts After='InstallFinalize' />
</InstallExecuteSequence>
这应该在安装完成后删除所有现有产品,尽管您可以自定义执行此操作的点
请参阅http://mohundro.com/blog/2009/02/23/getting-started-with-wix-and-major-upgrades/
还会看到this question
的已接受答案答案 3 :(得分:4)
如果产品代码和版本相同但包代码不同,您将始终收到Windows Installer错误消息。
我强烈建议在CI版本中包含安装程序的版本信息。如果您正在安装并随后升级每个版本,那么版本控制并不是一件坏事。将它添加到CI构建中应该相对容易。