【问题标题】:My last patch went out with the wrong UpgradeCode. How can I fix this in a subsequent patch?我的上一个补丁出现了错误的升级代码。如何在后续补丁中解决此问题?
【发布时间】:2016-06-06 13:13:52
【问题描述】:

前提

我正在使用 WiX 工具集 3.5。

我已经成功地为我的产品发布了几个使用相同 UpgradeCode 和 ProductCode 的补丁。但是,最近的两个补丁错误地使用了不同的 UpgradeCode。这些补丁安装成功,但我最新的补丁拒绝安装。

这是我自上次 MSI 发布以来的发布历史:

  1. 带有升级代码 A 的安装程序 (10.0.20935.0)。
  2. 带有 UpgradeCode A 的补丁 (10.0.21069.0)。
  3. 带有升级代码 A 的补丁 (10.0.21188.0)。
  4. 带有升级代码 A 的补丁 (10.0.21334.0)。
  5. 带有 UpgradeCode A 的补丁 (10.0.21671.0)。
  6. 带有 UpgradeCode B 的补丁 (10.1.0.264)。
  7. 带有 UpgradeCode C 的补丁 (10.1.0.21682)。
  8. Patch (10.2.0.0) 是最新的补丁,无论我使用的是 UpgradeCode A、B 还是 C,都会失败。

以下是我尝试安装补丁 10.2.0.0 时出现的错误信息:

Windows Installer 服务无法安装升级补丁,因为可能缺少要升级的程序,或者升级补丁可能会更新程序的不同版本。验证您的计算机上是否存在要升级的程序,并且您拥有正确的升级补丁。

不允许用户安装补丁。


问题

我需要发布一个补丁

  • 在生产环境 (10.1.0.21682) 上成功安装。
  • 允许我在未来继续发布补丁。

我如何做到这一点?


我尝试了什么?

我尝试了以下方法,但没有成功:

  • 将 UpgradeCode 更改为 A,即 10.0.21671.0 和更早版本的版本。
  • 将 UpgradeCode 更改为 B,即来自 10.1.0.264 的那个。
  • 将 UpgradeCode 更改为 C,即来自 10.1.0.21682 的那个。
  • 更改产品代码。
  • 直接从 10.0.21671.0 到 10.2.0.0 创建补丁(当然在生产中它将在 10.1.0.21682 上运行)。

以上所有情况都会导致相同的错误消息(在前提中给出)。我还在 StackOverflow 上找到了以下问题:

这导致我将OnlyDetect="no" 添加到我产品的.wxs 文件中新<Upgrade> 元素的<UpgradeVersion> 元素中:

<Upgrade Id="UpgradeCode C">
  <UpgradeVersion Property="OLD_PRODUCT_FOUND"
                  IncludeMaximum="yes"
                  Maximum="10.2.0.0"
                  MigrateFeatures="yes"
                  OnlyDetect="no" />
</Upgrade>

但是,这与之前的结果完全相同。


示例代码

我创建了一个小项目,用于复制我的场景。

以下是我的测试项目中产品版本 10.2.0.0 的 .wxs 文件:

<?xml version="1.0" encoding="UTF-8"?>
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
    <Product Id="{8CB0CC73-82B1-495E-B768-D1C38372678A}"
        Name="Sample Application"
        Language="1033"
        Version="10.2.0.0"
        Manufacturer="Sample Corporation"
        UpgradeCode="{7E72848F-FC99-4737-87DE-91C738B7C5EE}">

        <Package Description="Installs a file that will be patched."
            Comments="This Product does not install any executables"
            InstallerVersion="200"
            Compressed="yes" />

        <Media Id="1" Cabinet="product.cab" EmbedCab="yes" />
        <FeatureRef Id="SampleProductFeature"/>
    </Product>

    <Fragment>
        <Feature Id="SampleProductFeature" Title="Sample Product Feature" Level="1">
            <ComponentRef Id="Sample.txt" />
        </Feature>
    </Fragment>

    <Fragment>
        <DirectoryRef Id="SampleProductFolder">
            <Component Id="Sample.txt" Guid="{d738b2a9-0dbc-4381-9efd-5801723b1569}" DiskId="1">
                <File Id="Sample.txt" Name="Sample.txt" Source=".\$(var.Version)\Sample.txt" />             
            </Component>    
        </DirectoryRef>
    </Fragment>

    <Fragment>
        <Directory Id="TARGETDIR" Name="SourceDir">
            <Directory Id="ProgramFilesFolder" Name="PFiles">
                <Directory Id="SampleProductFolder" Name="Patch Sample Directory">
                </Directory>
            </Directory>
        </Directory>
    </Fragment>
</Wix>

以下是 10.2.0.0 版补丁的 .wxs 文件:

<?xml version="1.0" encoding="UTF-8"?>
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
    <Patch 
        AllowRemoval="no"
        Manufacturer="Sample Corp" 
        MoreInfoURL="http://www.dynamocorp.com/"
        DisplayName="Sample Patch" 
        Description="Small Update Patch" 
        Classification="Update"
        OptimizedInstallMode="yes">

        <Media Id="8000" Cabinet="RTM.cab" CompressionLevel="none">
            <PatchBaseline Id="RTM">            
            </PatchBaseline>
        </Media>

        <PatchFamilyRef Id="SamplePatchFamily"/>    
    </Patch>

    <Fragment>    
        <PatchFamily Id='SamplePatchFamily' Version='10.2.0.0' Supersede='no'>
        </PatchFamily>
    </Fragment>
</Wix>

【问题讨论】:

    标签: wix windows-installer upgrade patch


    【解决方案1】:

    您绝对不应该更改 ProductCode。如果您一直在构建更改 UpgradeCode 的 MSI 文件,那么可能更关键的项目正在更改。您构建了一个针对具有特定 ProductCode 和 PackageCode(基于您创建的 MSI 文件)的产品的补丁,这就是它想要的。

    最重要的是,我会检查带有 UpgradeCode C 的补丁 7 并没有更改已安装产品的 ProductCode 或 PackageCode,因为这是产生问题的补丁,如果您的新补丁 8 找不到要修补的产品,那就是 ProductCode 和PackageCode 它会寻找。这就是错误所说的 - 未安装此补丁所针对的 ProductCode(或 PackageCode)。换句话说,我非常怀疑该错误消息中的 UpgradeCode 是否重要,并且有关升级多个产品进行重大升级的链接文章与此类补丁问题无关,除非您担心重大升级,在这种情况下您只需列出所有需要升级的 UpgradeCode,因此这不是问题。

    【讨论】:

    • 在我的测试项目中,补丁之间唯一改变的是 UpgradeCode 和 Version。引入问题的补丁 7 也是如此。
    【解决方案2】:

    事实证明,解决方案很简单,只需禁用对最新补丁的 UpgradeCode 验证即可。这可以通过将Validate 上的UpgradeCode 属性设置为“no”来完成。

    <Media Id="8000" Cabinet="RTM.cab" CompressionLevel="none">
        <PatchBaseline Id="RTM">
            <Validate UpgradeCode="no" />
        </PatchBaseline>
    </Media>
    

    这个 10.2.0.0 补丁引入了新的 UpgradeCode,在 10.1.0.21682 之上成功运行,并且我能够成功执行三个后续补丁。 (这些补丁启用了 UpgradeCode 验证,并与 10.2.0.0 共享相同的 UpgradeCode。)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-02-02
      • 1970-01-01
      • 2018-03-14
      • 1970-01-01
      相关资源
      最近更新 更多