【问题标题】:Correct way to implement Wix companion files?实现 Wix 配套文件的正确方法?
【发布时间】:2010-10-25 10:24:30
【问题描述】:

我们目前正在将构建脚本从 3.0 升级到 3.5,并在此过程中修复了一堆旧的 ICE 错误。我已经阅读了许多文章,但对于使用伴随文件的最佳方法通常是什么感到有些困惑。

现在,假设文件 A.manifest 是 A.exe 的伴随文件...

最初:我们的旧版本将 2 个文件分解为 2 个组件:

<Component Guid="*" Id="A.exe" SharedDllRefCount="yes">
    <File Id="..." KeyPath="yes" Source="A.exe"/>
</Component>
<Component Guid="*" Id="A.exe.manifest" SharedDllRefCount="yes">
    <File CompanionFile="A.exe" Id="..." Source="A.exe.manifest"/>
</Component>

触发ICE54:警告组件'A.exe.manifest'使用文件'A.exe.manifest'作为其KeyPath,但文件的版本由文件'A.exe'提供 ,所以我想这显然是错误的。

第一种方法:所以我尝试将 KeyPath=yes 添加到同伴的目录中:

<Component .../>
<Component Guid="*" Id="A.exe.manifest" SharedDllRefCount="yes" KeyPath="yes">
    <File CompanionFile="A.exe" Id="..." Source="A.exe.manifest"/>
</Component>

这会抑制警告,但在 Orca 中组件的 KeyPath 列显示为空白,所以我怀疑它是否正确?

第二种方法:接下来我尝试组合组件:

<Component Guid="*" Id="A.exe" SharedDllRefCount="yes"> <!-- GUID is wrong! -->
    <File Id="..." KeyPath="yes" Source="A.exe"/>
    <File CompanionFile="A.exe" Id="..." Source="A.exe.manifest"/>
</Component>

但似乎允许 WiX 在此处自动生成 GUID 是行不通的。但是,如果我手动生成 GUID,每次我们构建它都会在升级时破坏组件规则!我们实际上部署了很多伴随文件,因此生成每个组件的哈希并永久存储它也可能不可行。对每个伴随文件使用虚拟注册表项也是如此。

TLDR:这两种方法中哪一种实际上是 WiX 中更好的做法?

【问题讨论】:

    标签: wix windows-installer wix3


    【解决方案1】:

    我的问题是您这样做是为了解决什么问题?一般来说,除非您对组件规则和使用/不使用伴随文件的服务含义有非常深刻的理解,否则您可能应该坚持 1:1 的组件:文件比率,其中所有文件都是关键文件。这不是一个绝对的规则,但它可能是 95-99% 的最佳值。

    也就是说,看看 File 元素上的 KeyPath 属性,记住当组件在 MSI 的 KeyPath 列中没有数据时,这意味着组件目录是关键路径。

    【讨论】:

    • 嗯,我认为通常将未版本化/不可版本化的文件设置为 DLL 或 EXE 的伴随文件是一个好主意,以便在升级/卸载期间添加伴随文件或正确删除 - 这是真的吗?我也了解 Windows Installer 能够处理具有修改时间和 MsiFileHash 的未版本化文件,但我们以前从未尝试过。该功能是否足够可靠?
    • 是的,它是可靠的。这取决于您希望对该文件发生什么。作为伴随文件,当密钥文件更新时,所有文件都会更新。由于它是自己的密钥文件,因此它的修改时间决定了它。如果用户/进程在安装文件后对其进行了调整怎么办?您希望在下一次升级期间取消这些调整,还是希望它们不受影响并且不再复制文件?
    • 啊,除了少数文件之外,几乎所有这些文件都实际安装到 Program Files 和 Common Files 中,因此用户永远不会修改它们。有了这个,我想最好按照您的建议将它们设为自己的密钥文件。 2.但是从“文件版本控制规则”来看,如果之后修改了未版本控制的文件,它永远不会被覆盖,所以假设它是自己的密钥文件,我该如何强制它这样做?
    • 搜索“wix 版本的谎言”。基本上这是一个黑客,你告诉 MSI 你的文件有一个版本,即使它没有。这会改变行为。 InstallShield 将此文件级别称为“始终覆盖”。这绕过了 REINSTALLMODE amus/omus 仅在包级别强制执行的事实。另一种方法是走配套路线,以便在更新 DLL 时获取更新的 TXT 文件。不幸的是,这正是 Windows Installer 的设计方式。它试图保护“用户数据”,但不理解 XML 文件之类的内容。
    猜你喜欢
    • 2016-02-26
    • 1970-01-01
    • 1970-01-01
    • 2011-12-03
    • 2010-09-21
    • 1970-01-01
    • 2017-10-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多