在使用WiX时,在“每个组件一个文件”方法上阅读this answer之后,我很想知道在其他元素(包括KeyPath
)上使用Component
属性时的最佳做法是什么,Directory
,Registry
等等。
我对任何一般性建议感兴趣,但这里有几个具体问题:
KeyPath="yes"
或其父Directory
上设置Component
?如果它是什么
不是空的?KeyPath="yes"
,那就是它
在其父组件上设置它的必要或良好做法?KeyPath
应该为每个文件使用注册表项并设置KeyPath="yes"
注册表元素......这是真的/必要吗?谢谢!
Directory
我知道Directory没有KeyPath,但在我的问题中没有明确/详细。 主要是,当我必须创建一个空目录时,我很好奇在组件上使用KeyPath。我发现在这种情况下,KeyPath =“yes”是在父组件上设置的。但这足以让安装程序检测/修复丢失的空文件夹吗?或者是否应该与注册表项一起使用?示例摘录:
<Directory Id="LOGS" Name="Logs">
<Component Id="LogsDir" Guid="*" KeyPath="yes">
<CreateFolder Directory="LOGS" />
</Component>
</Directory>
答案 0 :(得分:25)
一般而言,您应该根据KeyPath
选项的主要思想做出决定。来自MSDN:
此值指向属于该组件的文件或文件夹 安装程序用于检测组件。
因此,如果您为每个组件创作1个文件,那么当您意外删除文件并且修复没有将其恢复时,您将不会遇到这种情况。如果你为每个组件创作N个文件,无论如何你要么选择其中一个作为KeyPath
(并且WiX文档鼓励你明确地这样做),或者你添加一个额外的注册表项并让它成为{ {1}}。
回到你的问题:
如果我有一个安装程序需要创建的空目录,我应该 在目录或
上设置KeyPath =“yes”
Directory元素没有KeyPath
属性。
如果文件在每个组件的文件方案中具有KeyPath =“yes”,那么它是 在其父组件上设置它的必要或良好做法?
不,基本上,这没有意义。如果Component具有KeyPath
,则安装此组件的目录将成为关键路径。当你明确地在File上设置它时,显然文件是一个关键路径。
我在某处读到,不应该在文件上设置KeyPath,而是应该 为每个文件使用一个注册表项,并在注册表上设置KeyPath =“yes” 元素......那是真的/必要吗?
这听起来像胡说八道。同样,基于KeyPath="yes"
的一般需求 - 检测组件。为什么需要额外的注册表项来检测文件系统中是否存在文件?当您为每个组件创建1个注册表项(即N个文件)时,对于每个组件N个文件可能有意义,并让Windows Installer根据该注册表项判断,该组件是否被视为“未损坏”。
更新:您不必仅引入注册表项作为帮助安装程序跟踪空文件夹的关键路径。如果您将KeyPath
添加到父组件就足够了。
不要让事情复杂化。 Windows Installer非常复杂。 :) 希望这会有所帮助。