24

在阅读了使用 WiX 时“每个组件一个文件”方法的答案后,我很想知道在其他元素(包括、等)上使用KeyPath属性时的最佳实践是什么。ComponentDirectoryRegistry

我对任何一般性建议都感兴趣,但这里有几个具体问题:

  • 如果我有一个安装程序需要创建的空目录,我应该设置KeyPath="yes"Directory还是它的父目录Component?如果不为空怎么办?
  • 如果文件KeyPath="yes"在每个组件的文件场景中,是否有必要或良好的做法将其设置在其父组件上?
  • 我在某处读到,而不是KeyPath在文件上设置,应该为每个文件使用注册表项并KeyPath="yes"在注册表元素上设置......这真的是真的/有必要吗?

谢谢!

编辑#1 - 澄清重新:Directory

我知道 Directory 没有 KeyPath,但在我的问题中没有明确/详细。主要是,当必须创建一个空目录时,我对在组件上使用 KeyPath 感到好奇。我看到 KeyPath="yes" 在这种情况下被设置在父组件上。但这足以让安装程序检测/修复丢失的空文件夹吗?还是应该与注册表项一起使用?示例片段:

<Directory Id="LOGS" Name="Logs">
  <Component Id="LogsDir" Guid="*" KeyPath="yes">
    <CreateFolder Directory="LOGS" />
  </Component>
</Directory>
4

1 回答 1

26

一般来说,您应该根据KeyPath选项的主要思想做出决定。来自MSDN

此值指向属于 安装程序用来检测组件的组件的文件或文件夹。

因此,如果您为每个组件编写 1 个文件,您将不会遇到意外删除文件并且修复未将其恢复的情况。如果您为每个组件编写 N 个文件,则无论如何您要么选择其中一个KeyPath作为KeyPath.

回到你的问题:

如果我有一个安装程序需要创建的空目录,我应该在 Directory 上设置 KeyPath="yes" 还是

目录元素没有KeyPath属性。

如果文件在每个组件的文件方案中具有 KeyPath="yes",那么在其父组件上设置它是必要的还是良好的做法?

不,基本上,这没有意义。如果一个ComponentKeyPath="yes",那么这个组件的安装目录就成为一个关键路径。当您在File上显式设置它时,显然该文件是一个关键路径。

我在某处读到,而不是在文件上设置 KeyPath,应该为每个文件使用注册表项并在注册表元素上设置 KeyPath="yes" ......这真的是真的/必要吗?

这听起来像是胡说八道。再次,基于一般需要KeyPath- 检测组件。为什么需要额外的注册表项来检测文件系统上是否存在文件?对于每个组件有 N 个文件的情况,当您为每个组件(即 N 个文件)编写 1 个注册表项并让 Windows Installer 通过该注册表项判断该组件是否被认为“未损坏”时,这可能是有意义的。

更新:您不必仅仅为了作为帮助安装程序跟踪空文件夹的关键路径而引入注册表项。如果添加KeyPath='yes'到父组件就足够了。

不要把事情复杂化。Windows Installer 本身就相当复杂。:) 希望这可以帮助。

于 2012-04-28T06:10:20.510 回答