我正在编写具有 2 个要求的 WIX 安装程序:
- 实施升级规则(我成功地使用
<MajorUpgrade>
or<Upgrade>
表 - 保留一种强制安装与当前版本并行的旧版本的方法(因此不要升级)。
问题来自第二个要求:如果应用程序的所有版本都具有相同的UpgradeCode,系统将删除旧版本(具有相同的UpgradeCode)avec安装新版本。
那么是否可以升级旧版本(默认情况下)并让用户强制并行安装?我的一种解决方案是在安装 MSI 时更改 UpgradeCode。在这种情况下,两个版本将完全独立,这就是我想要的。
但是我没有找到在安装阶段指定另一个 UpgradeCode 的方法。我试过msiexec /i app.msi UpgradeCode="{60C200E9-E317-4a67-9CC1-7BF156DEF4FD}"
了,但根据日志,它可以正确获取 UpgradeCode 属性,但在构建 MSI 时仍使用 GUID 指定。
知道如何在安装 MSI 时强制升级代码吗?
有关信息,我的 Wix 文件的组成如下:
<?define ProductUpgradeCode = "32318521-631C-4064-88C6-4A54FAA3B383"?>
[...]
<Product Name='App' Id='*' UpgradeCode='$(var.ProductUpgradeCode)'
Language='1033' Codepage='1252' Version='1.0.0' Manufacturer='App inc'>
[...]
<MajorUpgrade AllowDowngrades="yes" Schedule="afterInstallInitialize" />
编辑 - 解决方案,基于 Ciprian 的回答:
首先,定义一个ALLOWUPGRADE
具有默认值的属性Yes
:
<Property Id="ALLOWUPGRADE" Value="Yes" />
然后,在 中设置操作<InstallExecuteSequence>
,因此它仅在以下情况下卸载旧版本ALLOWUPGRADE=Yes
:
<RemoveExistingProducts After="InstallFinalize">ALLOWUPGRADE="Yes"</RemoveExistingProducts>
而且,更好的是,添加一个对话框,询问用户是否要升级或进行并行安装。一个按钮ParallelInstallBtn
会将属性值更改为No
。FindRelatedProducts
如果某个部分检测到旧版本,则会调用此对话框UpgradeVersion
:
<UI>
<Dialog Id="InstallDlg" Width="370" Height="270" Title="[ProductName] Setup" NoMinimize="yes">
[...]
<Control Id="ParallelInstallBtn" Type="PushButton" X="280" Y="243" Width="80" Height="17" Default="no" Text="&Parallel Install">
<Publish Property="ALLOWUPGRADE" Value="No">1</Publish>
<Publish Event="EndDialog" Value="Return">1</Publish>
</Control>
</Dialog>
<InstallUISequence>
<Show Dialog="InstallDlg" After="FindRelatedProducts">OLDERVERSIONBEINGUPGRADED</Show>
</InstallUISequence>
</UI>