【问题标题】:Why do I need to specify a new guid for a version upgrade in wix为什么我需要为 wix 中的版本升级指定新的 guid
【发布时间】:2013-03-27 14:23:40
【问题描述】:

我刚刚根据之前的问题/答案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)相同,并且只更改主要版本 - 因此从 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) 完成的。

【问题讨论】:

    标签: installation wix


    【解决方案1】:

    它与产品指南无关。

    它始终与您在产品节点指定为属性的 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>
    

    【讨论】:

    • Bernd,感谢您的快速回复。我应该在我的示例中显示更多的 wix 代码,因为我确实有一个 UpgradeCode 并且对于所有版本都是相同的。因此,除非我更改 Guid,否则我的代码仍然允许使用 UpgradeCode 降级。我注意到您在示例中使用了 'Product Id="*"'。这不会自动为每个版本创建新的 Guid 吗?
    • @PeteOopNorf 是的,我总是生成一个新的产品 guid。是的,它不是最佳实践。我尽量避免进行小的或次要的更新。 msdn.microsoft.com/en-us/library/windows/desktop/…msdn.microsoft.com/en-us/library/windows/desktop/… 原因很简单,我不想在安装程序中设置“REINSTALLMODE=omus”并摆脱这些“已安装其他版本”消息。但这就是我所做的,不需要更改产品代码。你只需要关心版本号和升级代码。
    • 看来我正在尝试做一些仅适用于主要升级的小升级。根据msdn.microsoft.com/en-us/library/aa370840%28v=vs.85%29.aspx; “此过程依赖于 FindRelatedProducts 操作,该操作仅在首次安装期间运行......因为次要升级是通过重新安装执行的,所以此过程不能用于确定次要升级包是否正在尝试降级应用程序。”因此,将 FindRelatedProducts 与 UpgradeVersion 一起使用仅适用于重大升级(即产品 ID 的 Guid 更新)。
    • @BerndOtt 使用 Product="*" 是完全合理的做法。这只是意味着您决定只进行重大升级。这是完全合理的。
    • @PeteOopNorf 是正确的。上述解决方案仅适用于重大升级。小升级必须完全自定义。
    猜你喜欢
    • 1970-01-01
    • 2021-11-20
    • 1970-01-01
    • 2015-03-29
    • 2023-03-31
    • 1970-01-01
    • 2019-12-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多