我已经看到很多类似这样的问题在整个地方都被问到了,但我发现没有一个与我的特殊转折有关的问题得到了回答。我正在使用纯粹的 wix来构建小升级。
这个问题是一个与我的场景非常相似的例子,除了最后一部分。
- 我有一个产品,我为它构建了一个 RTM msi 文件,我们称之为 Product-1.0.msi
- 包含 A.dll
- 然后我构建了一个名为 Product-1.0.1.msp 的补丁,它使用 Product-1.0 作为它的基线
- 添加 B.dll
- 然后我构建了一个名为 Product-1.0.2.msp 的补丁,它也使用 Product-1.0 作为它的基线
- 添加 B.dll + C.dll
这意味着我的补丁将始终包含前面的修复并相互取代。
场景:
- 1.0 -> 1.0.1工作正常
- 1.0 -> 1.0.2工作正常
- 1.0 -> 1.0.1 -> 1.0.2不起作用
在最后一个场景中,msp 运行没有任何问题,但速度非常快。事后原因很明显,因为实际上什么都没做。在 ARP 中,补丁与版本 1.0.2 一起列在 Installed Updates 下,但目标产品未更新,添加到补丁 (C.dll) 的文件未添加到安装文件夹。更新也是如此,第二个补丁不会修改文件。
但是,在卸载 1.0.2 时,补丁 (C.dll) 中包含的文件会被删除,包括已经随 1.0.1 (B.dll) 安装的文件。
产品代码不变。
UpgradeCode 不变。
这是 Patch.wxs 的内容:
<?xml version="1.0" encoding="UTF-8"?>
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
<Patch MinorUpdateTargetRTM="yes"
AllowRemoval="yes"
Manufacturer="{Manufacturer}"
DisplayName="{ProductName} {Version} Patch"
Description="{ProductName} {Version} Patch"
Classification="Update"
TargetProductName="{ProductName}" >
<Media Id="5000" Cabinet="Patch.cab" EmbedCab="yes">
<PatchBaseline Id="RTM">
<Validate ProductVersionOperator="LesserOrEqual" ProductId="yes" UpgradeCode="yes" ProductVersion="Update" />
</PatchBaseline>
</Media>
<PatchFamilyRef Id="PatchFamily"/>
</Patch>
<Fragment>
<PatchFamily Id='PatchFamily' Version='{Version}' Supersede='yes'>
</PatchFamily>
</Fragment>
</Wix>
在此代码段中,{Version} 在第一个补丁中为 1.0.1,在第二个补丁中为 1.0.2。否则,它们是相同的。
对此有什么想法吗?