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

为什么我的WiX安装程序需要一个空的CreateFolder来有条件地更新Xml文件?,wix,windows-installer,wix-extension,Wix,Windows Installer,Wix Extension,TL;DR:为什么我需要此条件组件中的空元素才能使其工作 我正在为一个内部应用程序准备一个简单的基于WiX的安装程序。此安装程序需要部署一个标准配置文件(一个普通的.NET.config文件),然后使用在命令行上传递给msiexec的属性对其进行自定义 自定义设置之一是仅在定义了运行时属性的情况下创建特定的应用程序设置。以下是WiX组件: <Component Id="C.Rbnz.Fsis.CollectionPeriodService.exe.config.runtime"

TL;DR:为什么我需要此条件组件中的空
元素才能使其工作

我正在为一个内部应用程序准备一个简单的基于WiX的安装程序。此安装程序需要部署一个标准配置文件(一个普通的.NET
.config
文件),然后使用在命令行上传递给
msiexec
的属性对其进行自定义

自定义设置之一是仅在定义了运行时属性的情况下创建特定的应用程序设置。以下是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,则会创建新元素;如果没有,什么也不会发生

为什么此组件中必须有空的

当我试图让它工作时,我发现了“”,它显示了一个工作组件,但没有解释为什么需要

删除
会出现以下错误:

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


我敢肯定,一旦你知道了它的含义,这是非常有用的。

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

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

我理解其中的一部分-组件需要一个键路径,默认情况下它会获得一个目录,并且需要
来确保它工作正常。但它是哪个目录,在哪里?这安全吗?作为安装的一部分,这是否会在目标计算机上的某处创建空(碎片)文件夹?有没有更整洁的方法来实现这一点?它是您告诉组件其父目录的任何内容。根据错误消息,它是INSTALLDIR。@Bevan:空组件中缺少CreateFolder条目,该组件被设置为安装到一个空文件夹中,其中没有其他文件,将触发一种特殊情况,即Windows Installer在启动后删除该文件夹(因为它是空的)然后Windows Installer尝试在下一次启动时通过公布的快捷方式将其重新放回(这会触发密钥路径检查)。这种胡说八道在无休止的循环中重复。我刚刚验证了在Windows Installer的更高版本中是否修复了此问题,但我仍然看到了问题。CreateFolder条目防止出现这种特殊的自我修复问题。@Bevan:仅供参考,此问题与此常见自我修复问题摘要中的问题2相同:。