¿Por qué mi instalador de WiX necesita un CreateFolder vacío para actualizar condicionalmente un archivo Xml?


TL; DR : ¿Por qué necesito un vacío <CreateFolder/> elemento en este componente condicional con el fin de que funcione?

Estoy armando un instalador simple basado en WiX para una aplicación interna. Este instalador necesita implementar un archivo de configuración estándar (un archivo.NET .config normal) y luego personalizarlo usando las propiedades pasadas a msiexec en la línea de comandos.

Una de las personalizaciones es crear una configuración de aplicación específica solo si la propiedad RUNTIME se ha definido. Aquí está el componente WiX para eso:

  <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>

Esto funciona como quiero - si se especifica TIEMPO de ejecución en la línea de comandos para msiexec, se crea el nuevo elemento; si no, no pasa nada.

¿Por qué tengo que tener el <CreateFolder/> vacío dentro de este componente?

Mientras intentaba que esto funcionara, encontré "Wix Condition Statement", que mostraba un componente funcional, pero no explica por qué <CreateFolder/> es necesario.

Eliminando <CreateFolder/> me da este error:

ICE18: Ruta de teclado para el componente: 'C. Rbnz.Fsis.Servicio de recogida.exe.config.runtime 'es el directorio: 'INSTALLDIR'. El par Directorio / Componente debe aparecer en la tabla CreateFolders.

Que es, estoy seguro, bastante informativo una vez que sabes lo que significa.

Author: Stein Åsmul, 2012-09-03

2 answers

Cada componente tiene una ruta de acceso clave; la más común es un archivo. Su componente no tiene un archivo u otra ruta de clave, por lo que WiX le da el valor predeterminado de un directorio. Windows Installer aparece y dice que los componentes con rutas de claves de directorio deben asegurarse de que el directorio se cree, incluso si algo más lo hará. Es una regla tonta con una solución fácil.

 41
Author: Bob Arnson,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-09-03 02:14:11

Puede usar el parámetro KeyPath="yes" en su etiqueta de componente. Solo si el 'INSTALLDIR' es la ruta correcta para este componente.

 16
Author: Kim BG,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-06-12 08:15:47