为什么我需要在wix中为版本升级指定新的guid

时间:2013-04-05 08:37:08

标签: installer wix

我刚刚根据上一个问题/答案How to implement WiX installer upgrade?更新了我们的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)保持相同,并且仅为更改为major - 因此从1.x移动到2.x我们更改Guid

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

我想知道为什么会这样(假设我正确地做了) - 为什么我们需要两位信息(guid和版本)来实现这个目的?

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

1 个答案:

答案 0 :(得分: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>