TL; DR :为什么我需要在此条件组件中使用空 <CreateFolder/>
元素才能使其正常工作?
我正在为一个内部应用程序组装一个简单的基于WiX的安装程序。此安装程序需要部署标准配置文件(普通的.NET .config
文件),然后使用在命令行上传递给msiexec
的属性对其进行自定义。
其中一个自定义是仅在已定义RUNTIME属性时才创建特定的应用程序设置。以下是WiX组件:
<Component Id="C.Rbnz.Fsis.CollectionPeriodService.exe.config.runtime"
Guid="*">
<Condition>
<![CDATA[RUNTIME]]>
</Condition>
<CreateFolder/>
<util:XmlFile Id="X.Runtime.1"
Action="createElement"
ElementPath="/configuration/appSettings"
File="[#F.Rbnz.Fsis.CollectionPeriodService.exe.config]"
Name="add"
Sequence="2"/>
<util:XmlFile Id="X.Runtime.2"
File="[#F.Rbnz.Fsis.CollectionPeriodService.exe.config]"
ElementPath="/configuration/appSettings/add[\[]not(@key)[\]]"
Action="setValue"
Name="key"
Value="RunTime"
Sequence="3"/>
<util:XmlFile Id="X.Runtime.3"
File="[#F.Rbnz.Fsis.CollectionPeriodService.exe.config]"
ElementPath="/configuration/appSettings/add[\[]@key='RunTime'[\]]"
Action="setValue"
Name="value"
Value="[RUNTIME]"
Sequence="4"/>
</Component>
这正如我想要的那样 - 如果在msiexec
的命令行上指定了RUNTIME,则会创建新元素;如果没有,没有任何反应。
为什么我必须在此组件中使用空<CreateFolder/>
?
当我试图让这个工作时,我找到了“Wix Condition Statement”,它显示了一个工作组件,但没有解释为什么<CreateFolder/>
是必要的。
删除<CreateFolder/>
会出现此错误:
一旦你知道这意味着什么,我相信,这是非常有用的。ICE18:组件的KeyPath:'C.Rbnz.Fsis.CollectionPeriodService.exe.config.runtime'是目录:'INSTALLDIR'。目录/组件对必须列在CreateFolders表中。
答案 0 :(得分:43)
每个组件都有一条关键路径;最常见的是文件。您的组件没有文件或其他密钥路径,因此WiX为其提供了默认的目录。然后Windows Installer出现并说具有目录密钥路径的组件必须确保创建目录,即使其他内容也会这样做。这是一个很容易修复的愚蠢规则。
答案 1 :(得分:16)
您可以在组件标记中使用参数KeyPath =“yes”。只有'INSTALLDIR'是此组件的正确路径。