我已经看到很多这样的问题到处问,但我没有发现我对它的特别扭曲已经得到了回答。 I'm using purely wix 构建小升级。

This question 是一个很像我的场景的例子,除了最后一部分。

  • 我有一个产品,我为其构建了 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 一起列在已安装的更新下,但目标产品没有更新,添加到补丁 (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/

    10-14 14:30