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



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条件语句",它显示了一个工作组件,但没有解释为什么<CreateFolder/>是必要的。

删除<CreateFolder/>会出现以下错误:

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

我相信,一旦你知道它的含义,它就会提供很多信息。

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

您可以在组件标记中使用parametere KeyPath="yes"。仅当"INSTALLDIR"是此组件的正确路径时。

相关内容

  • 没有找到相关文章