我已经看到很多这样的问题到处问,但我没有发现我对它的特别扭曲已经得到了回答。 I'm using purely wix 构建小升级。
This question 是一个很像我的场景的例子,除了最后一部分。
这意味着我的补丁将始终包含之前的修复并相互取代。
场景:
在最后一种情况下,msp 运行时没有提示,但速度非常快。事后原因很明显,因为实际上什么也没做。在 ARP 中,补丁与版本 1.0.2 一起列在已安装的更新下,但目标产品没有更新,添加到补丁 (C.dll) 的文件没有添加到安装文件夹中。更新也是如此,文件不会被第二个补丁修改。
卸载 1.0.2 时,包含在补丁 (C.dll) 中的文件会被删除,但是 包括 那些已经与 1.0.1 (B.dll) 一起安装的文件。
ProductCode 不变。
升级代码不变。
这是 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。否则,它们是相同的。
对此有何想法?
最佳答案
我终于让它工作了,这就是我发现的。
首先, enable MSI logging 。
我发现了两个导致相同行为的问题。
我发现 的第一个线索是来自 MSI 日志的这两个片段:
1.0.1 安装:
MSI (s) (A4:60) [09:42:30:917]: SELMGR: New components have been added to feature 'ProductFeature'
MSI (s) (A4:60) [09:42:30:918]: SELMGR: Component 'comp_F8F80909F3D340B19A4CF3E6E172F386' is a new component added to feature 'ProductFeature'
....
MSI (s) (A4:60) [09:42:33:077]: Executing op: ComponentRegister(ComponentId={B49318A5-8DDE-449F-9B77-B67A3F7F8952},KeyPath=C:\[...]\B.dll,State=3,,Disk=1,SharedDllRefCount=0,BinaryType=0)
这是补丁中添加的新文件 (B.dll)。
1.0.2 安装:
MSI (s) (A4:70) [09:47:02:508]: SELMGR: ComponentId '{B49318A5-8DDE-449F-9B77-B67A3F7F8952}' is registered to feature 'ProductFeature', but is not present in the Component table. Removal of components from a feature is not supported!
MSI (s) (A4:70) [09:47:02:508]: SELMGR: Removal of a component from a feature is not supported
这样做的原因,恐怕很简单,也略显尴尬。 B.dll 已被标记为新的组件 ID。出于某种原因,安装程序(直接运行 msi/msp)没有说明错误并简单地放弃,但将应用程序注册为好像它处于升级状态(ARP 中的 1.0.2)。
所以我在这里给你的提示是: 区分你生成的片段 并确保来自基线 的任何新文件出现在两个补丁 .wxs 文件中,具有相同的组件和文件 ID !即使你已经认为你知道他们知道。
第二个问题 是我想使用 the WixNetfxExtension 捆绑 .Net:
问题是我试图在断开连接的系统上安装并将 redist 安装程序放在包中,而不是放在包可执行文件的“redist”子文件夹中。同样,安装程序只是放弃并让应用程序处于(错误的)升级状态,即使 .Net 已经安装。这真的不应该发生,特别是因为 .Net 是一个先决条件,所以我可能对包做了一些其他的事情,阻止它在出现错误时按照它应该的方式行事。
关于Wix - 取代补丁没有任何作用,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/19664040/