【问题标题】:WiX: Patching a patch no longer works after upgrading from WiX 3.0 to WiX 3.6-8WiX:从 WiX 3.0 升级到 WiX 3.6-8 后,修补补丁不再有效
【发布时间】:2014-07-01 16:07:59
【问题描述】:

我有一组 WiX 脚本,用于为补丁创建补丁,例如我将拥有以下版本号的完整安装程序:

11.00.38.01 11.00.38.02 11.00.38.03

然后我会在这些数字之间创建补丁,即

11.00.38.01-11.00.38.02 11.00.38.02-11.00.38.03

将这些脚本与 WiX 3.0 一起使用,我将能够运行

11.00.38.01

然后应用

11.00.38.01-11.00.38.02 和 11.00.38.02-11.00.38.03 补丁,

这将使安装达到

11.00.38.03

升级到 WiX 3.6 及更高版本的 3.7 和 3.8 后,这不再有效。

我可以安装一个版本并将一个补丁应用到该版本,但我无法安装一个版本、修补安装,然后再应用另一个补丁。

如果我尝试这样做,我会收到以下错误:

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

我的补丁模板如下所示:

<?xml version="1.0" encoding="UTF-8"?>
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
    <Patch
        AllowRemoval="no"
        Manufacturer="Acme"
        MoreInfoURL="http://www.acme.com/"
        DisplayName="$(var.ProductName) $(var.ProductVersion) Upgrade"
        Description="Minor Upgrade"
        Classification="Update"
    >

        <Media Id="5000" Cabinet="RTM.cab">
            <PatchBaseline Id="RTM"/>
        </Media>

        <PatchFamilyRef Id="$(var.ProductShortName)UpgradeFamily"/>
    </Patch>

    <Fragment>
        <PatchFamily Id='$(var.ProductShortName)UpgradeFamily' Version='1.0.0.0' Supersede='yes'>
            <ComponentGroupRef Id='PatchComponents' />
        </PatchFamily>
    </Fragment>
</Wix>

产品的部分 .wxs 脚本如下所示:

<Product Name='Acme Server'
    Id='6DE00366-36D8-4BA0-B911-8FBD7490C472'
    UpgradeCode='0FDE99AC-D910-46CF-814D-D851B81D3816'
    Language='1033'
    Codepage='1252'
    Version='$(var.ProductVersion)'
    Manufacturer='Acme'>
    <Package
        Id='*'
        Keywords='Installer'
        Description="Acme Server"
        Comments='Acme Server is a registered trademark of Acme.'
        Manufacturer='Acme'
        InstallerVersion='200'
        Languages='0'
        Compressed='yes'
        SummaryCodepage='1252'
        Platform='x86'
    />

    <Upgrade Id='0FDE99AC-D910-46CF-814D-D851B81D3816'>
        <UpgradeVersion OnlyDetect='yes' Property='SELFFOUND'
            Minimum='$(var.ProductVersion)' IncludeMinimum='yes' Maximum='$(var.ProductVersion)' IncludeMaximum='yes' />
        <UpgradeVersion OnlyDetect='yes' Property='NEWERFOUND'
            Minimum='$(var.ProductVersion)' IncludeMinimum='no' />
    </Upgrade>
</Product>

有趣的是,WiX 3.0 补丁日志包含以下行:

PATCH SEQUENCER:验证次要升级补丁的适用性 c:\Install\10.10.11.01-10.10.11.02\AcmeServer.msp 针对产品 代码:{6DE00366-36D8-4BA0-B911-8FBD7490C472},产品版本: 10.10.1101,产品语言 1033 和升级代码:{0FDE99AC-D910-46CF-814D-D851B81D3816}

而 WiX 3.6+ 补丁日志包含这一行:

PATCH SEQUENCER:验证 QFE 补丁的适用性 c:\11.00.38.01-11.00.38.02\AcmeServer.msp 针对产品代码: {6DE00366-36D8-4BA0-B911-8FBD7490C472},产品版本:11.00.3801, 产品语言 1033 和升级代码: {0FDE99AC-D910-46CF-814D-D851B81D3816}

请注意,3.0 日志显示“次要升级补丁”,而 3.6+ 日志显示“QFE 补丁”。我不知道这是否相关。

我在这里做错了什么?为什么生成的补丁的行为发生了变化?当然,过去几年对 WiX 脚本进行了一些细微的调整,但据我所知,它们都与修补过程无关。似乎主要变化是由于从 WiX 3.0 切换到更新版本。

编辑:

我已确认此更改恰好发生在我从 WiX 3.0 切换到 WiX 3.6 时。

我还注意到,如果我应用 WiX 3.0 生成的补丁,则在将补丁应用于完整安装或其他补丁时,版本号会在程序和功能中更新,而使用 WiX 3.6+-生成的补丁,补丁应用到完整安装时版本号保持不变。

我想知道命令行工具(torch、pyro 等)的默认值是否已更改?

【问题讨论】:

  • 我的猜测是它与PackageCodes有关。 QFE 和次要升级之间的区别在于 PackageCode 是否已更改。另一个线索是已安装产品的标识是(ProductCode+PackageCode),并且补丁有一个在系统上找不到的目标包代码。因此,一些补丁组合改变了产品的包代码,而另一些则没有。
  • 使用 WiX 3.0 生成的补丁将更新程序和功能中的版本号。如果由 WiX 3.6+ 生成,则版本号不会更新(尽管在这两种情况下文件都在更新)。

标签: wix patch


【解决方案1】:

解决方案是向 PatchFamily 元素添加 ProductVersion 属性引用,如下面的 sn-p 所示:

<Fragment>
    <PatchFamily Id='$(var.ProductShortName)UpgradeFamily' Version='1.0.0.0' Supersede='yes'>
        <PropertyRef Id="ProductVersion"/>
        <ComponentGroupRef Id='PatchComponents' />
    </PatchFamily>
</Fragment>

仅此而已。

我没有在任何文档或网络上找到的通常的旧示例补丁脚本中看到这一点,但现在我知道要查找什么,很容易找到有关它的讨论。

正如我在最初的问题中提到的,在使用 WiX 3.0 时这个元素不是必需的,这可能在某种程度上解释了它在旧补丁示例中的缺失。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-01-24
    • 1970-01-01
    • 1970-01-01
    • 2023-03-16
    • 2018-04-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多