3

我刚刚根据上一个问题/答案更新了我们的 wix 安装脚本如何实施 WiX 安装程序升级?. 这个想法是为了防止旧版本“降级”新版本。所以我有部分 wix 文件看起来像:

  <Product Id="A_GUID"
    <Upgrade Id="18626be5-521c-4b58-ab8a-54baddf66679">
      <UpgradeVersion
        Property="NEWERVERSIONDETECTED"
        Minimum="$(var.Version)"
        IncludeMinimum="no"
        OnlyDetect="yes"
        ExcludeLanguages="yes"        
        />
     </Upgrade>

     <CustomAction Id="NewerVersionFound" Error="Can't downgrade." />

     <InstallExecuteSequence>
       <Custom Action="NewerVersionFound"
             After="FindRelatedProducts">NEWERVERSIONDETECTED</Custom>
       <RemoveExistingProducts After="InstallInitialize" />
     </InstallExecuteSequence>

我有两个版本,比如 2.1 和 2.2。当前的做法是保持 Product Id Guid(如上面的“A_GUID”)对于次要版本(如 2.x)相同,并且只更改主要版本 - 因此从 1.x 移动到 2.x 我们更改了 Guid .

但是,如果 2.1 和 2.2 的 Product Guid 保持不变,尽管 '$(var.Version)' 发生了变化,上述方法将不起作用。如果我更改 Guid,它确实有效(并防止降级 2.2 -> 2.1)。

我想知道为什么会这样(假设我做得正确) - 为什么我们需要两位信息(guid 和版本)才能工作?

Edit1a:wix 中有一个 UpgradeCode Guid,每个版本都保持相同。Edit1b:如果相关,这是使用旧版本的 wix (2.x) 完成的。

4

1 回答 1

4

它与产品指南无关。

它始终与您在产品节点上指定为属性的 UpgradeCode 相关。

<Product Id="*" Name="name" Version="$(var.Version)" UpgradeCode="12345678-55F7-4731-A318-772EF75D2830">

在升级节点中,您正在查看升级代码(而不是产品 guid)。您可以指定多个升级代码来查找软件的不同版本。但升级代码通常应该在产品中保持不变。请参阅 MS 主页上的最佳实践。

    <Upgrade Id="12345678-55F7-4731-A318-772EF75D2830">
        <UpgradeVersion ExcludeLanguages="no" Property="OLDVERSIONFOUND"   
            IgnoreRemoveFailure="yes" MigrateFeatures="no" IncludeMinimum="no"                
            Minimum="0.0.0.0" Maximum="$(var.Version)" IncludeMaximum="no"                
        />
        <UpgradeVersion OnlyDetect="yes" Property="NEWAPPFOUND" IncludeMinimum="yes" Minimum="$(var.Version)" Maximum="99.99.99.99" />
    </Upgrade>

通过自定义操作(您已经拥有),您可以对此做出反应。

 <CustomAction Id="OldAppFound" Error="Newer app of [ProductName] is installed" />

当然,您需要在序列中安排测试(您也这样做了)

    <InstallExecuteSequence>
        <Custom Action="OldAppFound" After="FindRelatedProducts">NEWAPPFOUND</Custom>
    </InstallExecuteSequence>
    <InstallUISequence>
        <Custom Action="OldAppFound" After="FindRelatedProducts">NEWAPPFOUND</Custom>
    </InstallUISequence>

如有必要,请删除旧的(您的代码中也有)

    <InstallExecuteSequence>    
        <RemoveExistingProducts After="InstallInitialize" />
    </InstallExecuteSequence>
于 2013-04-05T08:59:47.657 回答