Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/wix/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
WiX:从WiX 3.0升级到WiX 3.6-8后,修补程序不再工作_Wix_Patch - Fatal编程技术网

WiX:从WiX 3.0升级到WiX 3.6-8后,修补程序不再工作

WiX:从WiX 3.0升级到WiX 3.6-8后,修补程序不再工作,wix,patch,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 在WIX3.0中使用这些脚本,我将能够运行 11.00.38.01 然后应用 11.00.38.01-11.00.38.02和11.00.38.02-11.00.38.03补丁 这将使安装达到 11.00.3

我有一套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

在WIX3.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>
<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>

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

<?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>
<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脚本有一些小的调整,但据我所知,它们都与补丁过程无关。似乎主要的变化是由于从WIX3.0切换到了更新的版本

编辑:

我已经验证了这个变化正好发生在我从WIX3.0切换到WIX3.6的时候

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


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

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

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

这就是全部

我没有在任何文档中看到这一点,也没有在web上找到的常见的、旧的补丁脚本示例中看到,尽管现在我知道要查找什么,找到关于它的讨论已经足够容易了


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

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