【问题标题】:Wix - how to override UpgradeCode when installing an MSI fileWix - 安装 MSI 文件时如何覆盖 UpgradeCode
【发布时间】:2012-05-09 13:24:32
【问题描述】:

我正在编写具有 2 个要求的 WIX 安装程序:

  1. 实施升级规则(我使用<MajorUpgrade><Upgrade> 表成功地做到了
  2. 保留一种方法来强制安装旧版本与当前版本并行(因此不要升级)。

问题来自第二个要求:如果应用的所有版本都具有相同的UpgradeCode,系统将删除旧的(具有相同的UpgradeCode)avec安装新的。

那么是否可以升级旧版本(默认)并让用户强制并行安装? 我的一种解决方案是在安装 MSI 时更改 UpgradeCode。在这种情况下,两个版本将完全独立,这就是我想要的。

但我没有找到在安装阶段指定另一个 UpgradeCode 的方法。我尝试了msiexec /i app.msi UpgradeCode="{60C200E9-E317-4a67-9CC1-7BF156DEF4FD}",但根据日志,它正确获取了 UpgradeCode 属性,但在构建 MSI 时仍使用指定的 GUID。

知道如何在安装 MSI 时强制使用 UpgradeCode 吗?

关于信息,我的 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" />

然后,在&lt;InstallExecuteSequence&gt; 中设置操作,因此它仅在ALLOWUPGRADE=Yes 时卸载旧版本:

<RemoveExistingProducts After="InstallFinalize">ALLOWUPGRADE="Yes"</RemoveExistingProducts>

而且,更好的是,添加一个对话框,询问用户是否要升级或进行并行安装。按钮ParallelInstallBtn 将属性值更改为No。如果UpgradeVersion 部分检测到旧版本,则将在FindRelatedProducts 之后调用此对话框:

<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="&amp;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>

【问题讨论】:

  • 您应该将解决方案作为答案发布并接受(鼓励这样做!),而不是将其编辑到您的问题中。

标签: wix windows-installer


【解决方案1】:

您可以通过调节 RemoveExistingProducts 操作来做到这一点。

 <InstallExecuteSequence> 
      <RemoveExistingProducts After="InstallFinalize">ALLOWUPGRADE="Yes"</RemoveExistingProducts> 
 </InstallExecuteSequence> 

默认情况下,ALLOWUPGRADE 属性的值为“Yes”。当您不想执行升级时,请更改它。

【讨论】:

  • 效果很好,谢谢!我更新了我的帖子并添加了一个询问是否升级的用户对话框。
  • 正在寻找这个问题的答案。谢谢。
猜你喜欢
  • 1970-01-01
  • 2014-11-20
  • 1970-01-01
  • 2016-02-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多