Wix - 如何在安装MSI文件时覆盖UpgradeCode

时间:2012-05-09 13:24:32

标签: wix windows-installer msiexec

我正在编写一个包含2个要求的WIX安装程序:

  1. 实施升级规则(我使用<MajorUpgrade><Upgrade>
  2. 成功完成了升级规则
  3. 保持与当前版本并行强制安装旧版本的方法(所以不要升级)。
  4. 问题来自第二个要求:如果应用程序的所有版本都具有相同的UpgradeCode,系统将删除旧版本(使用相同的UpgradeCode)avec安装新版本。

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

    但我没有找到在安装阶段指定另一个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="&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>
    

1 个答案:

答案 0 :(得分:3)

您可以通过调整RemoveExistingProducts操作来执行此操作。

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

默认情况下,ALLOWUPGRADE属性的值为“是”。当您没有观看要执行的升级时,请更改它。