WiX:从WiX 3.0升级到WiX 3.6-8后,修补补丁不再有效

时间:2014-07-01 16:08:00

标签: wix patch

我有一组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日志表示&#34;次要升级补丁&#34;而3.6+日志表示&#34; QFE补丁&#34;。我不知道这是否相关。

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

编辑:

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

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

我想知道命令行工具(火炬,火焰等)是否有任何默认值发生变化?

1 个答案:

答案 0 :(得分:0)

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

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

这就是它的全部内容。

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

正如我在原始问题中所提到的,当使用WiX 3.0时,这个元素不是必需的,这可能会在某种程度上解释它在旧补丁样本中的缺失。