为什么我的WiX安装程序需要一个空的CreateFolder来有条件地更新一个Xml文件?

TL; DR :为什么在这个条件组件中需要一个空的 <CreateFolder/>元素才能使其工作?

我正在为一个内部应用程序组build一个简单的基于WiX的安装程序。 这个安装程序需要部署一个标准的configuration文件(一个普通的.NET .config文件),然后使用在命令行msiexec属性来定制它。

其中一种自定义是只有在定义了RUNTIME属性的情况下才创build特定的应用程序设置。 下面是这个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,则会创build新元素; 如果没有,没有任何反应。

为什么我必须在这个组件中有空的<CreateFolder/>

当我试图得到这个工作,我发现“ WIX条件声明 ”,它显示了一个工作组件,但没有解释为什么<CreateFolder/>是必要的。

删除<CreateFolder/>给我这个错误:

ICE18:组件的键path:“C.Rbnz.Fsis.CollectionPeriodService.exe.config.runtime”是目录:“INSTALLDIR”。 目录/组件对必须列在CreateFolders表中。

这是,我相信,一旦你知道这意味着什么,相当丰富。

每个组件都有一个关键path; 最常见的是一个文件。 您的组件没有文件或其他关键path,所以WiX将其设置为目录的默认值。 Windows安装程序随之而来,并表示,具有目录关键path的组件必须确保目录被创build,即使其他东西会这样做。 这是一个简单的修复愚蠢的规则。

您可以在组件标签中使用参数KeyPath =“yes”。 只有当“INSTALLDIR”是这个组件的正确path。