gpt4 book ai didi

Wix - 取代补丁不做任何事情

转载 作者:行者123 更新时间:2023-12-04 23:53:26 24 4
gpt4 key购买 nike

我已经看到很多像这样的问题到处都是,但我发现没有一个以我的特殊方式得到回答。 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不变。
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。否则,它们是相同的。

对此有什么想法吗?

最佳答案

我终于让它工作了,这是我的发现。首先,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)。

所以我在这里给你的提示是:区分你生成的片段并确保来自基线的任何新文件在两个补丁中都以相同的组件和文件 ID 出现 .wxs 文件!即使您已经认为自己知道他们知道。

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

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

关于Wix - 取代补丁不做任何事情,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19664040/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com