WiX:从WiX 3.0升级到WiX 3.6-8后,修补程序不再工作
我有一套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服务无法安装升级修补程序 因为要升级的程序可能丢失,或者升级失败 修补程序可能会更新程序的不同版本。验证 您的计算机上存在要升级的程序,并且您具有 正确的升级补丁 我的修补程序模板如下所示: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
<?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+生成,则版本号不会更新(尽管在这两种情况下文件都在更新)。