WiX的'KeyPath'属性是什么?

145

WiX中的'KeyPath'属性是什么?特别地,它如何应用于以下内容:

<Component Id="ProgramMenuDir" Guid="*">
  <RemoveFolder Id="ProgramMenuDir" On="uninstall" />
  <RegistryValue Root="HKCU" Key="Software\CompName\AppName" 
                 Type="string" Value="" KeyPath="yes" />
</Component>

127
天啊,Wix文档真是无用至极。Wix文档中说,如果你将KeyPath属性设置为"Yes",则该文件将被视为组件的关键路径。多么有用啊!! - Cheeso
11
@RobMensching - 感谢您的精神和愿意为社区做出贡献。告诉我如何不抱怨并不如告诉我(和其他人)如何抱怨。如果两年前我知道提出错误的地方,我会这样做。而且,正如您可以看到的赞数一样,显然其他人也有类似的感受。也许现在是时候发布这样的信息了:“帮助改进WiX!请通过点击此处来提出相应的错误。” - Cheeso
26
好的,@Cheeso!请在这里提交错误:http://wixtoolset.org/bugs - Rob Mensching
8
重点理解的概念是,WiX安装程序项目生成一个Windows Installer包。WiX文档不会(并且大多数情况下不应该)复制Windows Installer文档。虽然您通常可以在不了解其支持的Windows Installer表格的情况下使用WiX构造,但如果有任何疑问,您应该查阅MSDN上的文档。对于组件,请从这里开始查看:http://msdn.microsoft.com/en-us/library/windows/desktop/aa368007(v=vs.85).aspx。 - Tom Blodget
40
@TomBlodget:我认为WiX应该复制Windows Installer文档。对于大多数用户来说,WiX/Windows Installer的分离只会导致混淆,而且隐藏更多内容对最终用户来说使用起来更加容易。 - Scott Stafford
显示剩余4条评论
1个回答

139

Rob Mensching所解释的

组件的KeyPath是Windows Installer用来确定计算机上是否“存在”组件的单个资源。

这意味着当Windows Installer决定是否安装您的组件时,它将首先查看关键路径资源是否已经存在。如果存在,则不会安装组件中的任何资源。

关键路径资源的存在还确定了组件在您“修复”MSI时是否已损坏或丢失。

当关键路径资源是带版本的文件时,Windows Installer仅在找到具有相等或更高版本的文件时才认为它存在。

在您特定的示例中,您有一个组件,在卸载时删除文件夹。只有在给定的注册表键尚不存在时,此组件才会被安装。当您需要为无法用作关键路径自身的组件(例如shortcut)安装资源时,添加注册表键以用作关键路径是一种常见的技巧。


5
那么,明确地给组件中唯一的文件添加 keypath="no" 属性有什么意义呢? - Christopher B. Adkins
5
@Adkins:这将抑制Wix的默认行为,不再以该文件作为关键路径(keypath)写入安装程序数据库中。因此,在安装过程中,Windows Installer将使用该组件的目标文件夹作为关键路径。另一种实现这种行为的方法是在组件元素本身上设置“keypath = yes”。无论如何,我认为这不是一个好主意。 - Wim Coenen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接