48

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>

这就像我想要的那样工作 - 如果在命令行上指定 RUNTIME msiexec,则创建新元素;如果没有,什么都不会发生。

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

当我试图让它工作时,我发现了“ Wix Condition Statement ”,它显示了一个工作组件,但没有解释为什么<CreateFolder/>是必要的。

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

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

我敢肯定,一旦您知道它的含义,就会提供很多信息。

4

2 回答 2

50

每个组件都有一个关键路径;最常见的是文件。您的组件没有文件或其他关键路径,因此 WiX 为其提供了默认目录。然后 Windows 安装程序出现并说具有目录键路径的组件必须确保创建目录,即使其他东西会这样做。这是一个很容易解决的愚蠢规则。

于 2012-09-03T02:14:11.473 回答
21

您可以在组件标签中使用参数 KeyPath="yes"。仅当“INSTALLDIR”是该组件的正确路径时。

于 2013-06-12T08:15:47.647 回答