实现 Wix 伴随文件的正确方法?
我们目前正在将构建脚本从 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 中更好的实践?
We're currently in the process of upgrading our build scripts from 3.0 to 3.5, and fixing a bunch of old ICE errors along the way. I've read through a number of articles, but I'm slightly confused as to what is usually the best approach to using companion files.
Now, assuming File A.manifest is a companion file to A.exe...
Originally: our old build breaks up the 2 files in 2 components:
<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>
Which triggers ICE54: WARNING Component 'A.exe.manifest' uses file 'A.exe.manifest' as its KeyPath, but the file's version is provided by the file 'A.exe', so I guess it's obviously wrong.
1st approach: So I tried adding KeyPath=yes to the companion's directory:
<Component .../>
<Component Guid="*" Id="A.exe.manifest" SharedDllRefCount="yes" KeyPath="yes">
<File CompanionFile="A.exe" Id="..." Source="A.exe.manifest"/>
</Component>
This suppresses the warning, but in Orca the KeyPath column of the component shows as blank, so I have doubts it's correct?
2nd approach: Next I tried combining the components:
<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>
But it seems that allowing WiX to automatically generate the GUIDs here wouldn't work. But if I have the GUIDs manually generated, each time we build it would break component rules when upgrading! We actually deploy a lot of companion files, so generating a hash of each component and permanently storing it might be unfeasible too. Ditto for using a dummy registry key for each companioned file.
TLDR: Which of the 2 approaches is actually the better practice in WiX?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
我的问题是你这样做想解决什么问题?一般来说,除非您对组件规则以及使用/不使用伴随文件的服务影响有非常深入的了解,否则您可能应该坚持 1:1 的组件:文件比率,其中所有文件都是关键文件。这不是绝对规则,但可能是 95-99% 的最佳规则。
也就是说,请查看 File 元素上的 KeyPath 属性,并记住,当组件在 MSI 的 KeyPath 列中没有数据时,这意味着组件目录是关键路径。
My question would be what problem are you trying to solve in doing this? In general, unless you have a really strong understanding of the component rules and the servicing implications of using/not using companion files, you should probably stick to a 1:1 component:file ratio where all files are key files. This is not an absolute rule but it's probably 95-99% optimal.
That said, take a look at the KeyPath attribute on the File element and remember that when a component doesn't have data in the KeyPath column of the MSI, that means the components directory is the key path.