3

我已经看到很多类似这样的问题在整个地方都被问到了,但我发现没有一个与我的特殊转折有关的问题得到了回答。我正在使用纯粹的 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。否则,它们是相同的。

对此有什么想法吗?

4

1 回答 1

2

我终于让它工作了,这就是我发现的。首先,启用 MSI 日志记录
我发现了两个导致相同行为的问题。

我发现的第一个线索是 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 !即使你已经认为你知道他们知道。

第二个问题是我想使用WixNetfxExtension捆绑 .Net :

问题是我尝试在断开连接的系统上进行安装,并将 redist 安装程序放在包中,而不是放在包可执行文件的“redist”子文件夹中。同样,安装程序只是放弃并让应用程序处于(错误地)升级状态,即使已经安装了 .Net。这真的不应该发生,特别是因为 .Net 是一个先决条件,所以我可能对捆绑包做了其他事情,阻止它在错误时按照应有的方式行事。

于 2013-11-04T08:04:31.447 回答