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

时间:2012-09-03 01:28:09

标签: wix windows-installer msiexec wix-extension

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表中。

一旦你知道这意味着什么,我相信,这是非常有用的。

2 个答案:

答案 0 :(得分:43)

每个组件都有一条关键路径;最常见的是文件。您的组件没有文件或其他密钥路径,因此WiX为其提供了默认的目录。然后Windows Installer出现并说具有目录密钥路径的组件必须确保创建目录,即使其他内容也会这样做。这是一个很容易修复的愚蠢规则。

答案 1 :(得分:16)

您可以在组件标记中使用参数KeyPath =“yes”。只有'INSTALLDIR'是此组件的正确路径。