web-dev-qa-db-fra.com

Pourquoi mon installateur WiX a-t-il besoin d'un CreateFolder vide pour mettre à jour conditionnellement un fichier Xml?

TL; DR : Pourquoi ai-je besoin d'un élément vide<CreateFolder/> Dans ce composant conditionnel afin pour le faire fonctionner?

Je prépare un simple programme d'installation basé sur WiX pour une application interne. Ce programme d'installation doit déployer un fichier de configuration standard (un fichier .NET .config Normal), puis le personnaliser à l'aide des propriétés transmises à msiexec sur la ligne de commande.

L'une des personnalisations consiste à créer un paramètre d'application spécifique uniquement si la propriété RUNTIME a été définie. Voici le composant WiX pour cela:

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

Cela fonctionne exactement comme je le souhaite - si RUNTIME est spécifié sur la ligne de commande pour msiexec, le nouvel élément est créé; sinon, rien ne se passe.

Pourquoi dois-je avoir le <CreateFolder/> Vide dans ce composant?

Pendant que j'essayais de faire fonctionner cela, j'ai trouvé " Wix Condition Statement ", qui montrait un composant fonctionnel, mais n'explique pas pourquoi <CreateFolder/> Est nécessaire.

La suppression de <CreateFolder/> Me donne cette erreur:

ICE18: KeyPath pour le composant: "C.Rbnz.Fsis.CollectionPeriodService.exe.config.runtime" est le répertoire: "INSTALLDIR". La paire répertoire/composant doit être répertoriée dans le tableau CreateFolders.

ce qui est, je suis sûr, assez informatif une fois que vous savez ce que cela signifie.

44
Bevan

Chaque composant a un chemin d'accès clé; le plus courant est un fichier. Votre composant n'a pas de fichier ou autre chemin de clé, donc WiX lui donne la valeur par défaut d'un répertoire. Windows Installer arrive ensuite et dit que les composants avec des chemins de clé de répertoire doivent garantir que le répertoire est créé, même si quelque chose d'autre le fera. C'est une règle stupide avec une solution facile.

44
Bob Arnson

Vous pouvez utiliser le paramètre KeyPath = "yes" dans votre balise de composant à la place. Uniquement si 'INSTALLDIR' est le chemin correct pour ce composant.

19
Kim BG