【发布时间】: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+ 生成,则版本号不会更新(尽管在这两种情况下文件都在更新)。