web-dev-qa-db-fra.com

Wix - Configuration correcte du dossier d'installation

Je crée un programme qui est installé par Wix, en utilisant VS 2010 et j'ai déjà le product.wxs prêt.

Dans mon fichier wxs, j'ai des définitions de répertoires qui ressemblent à ceci:

<SetDirectory Id="INSTALLFOLDER" Value="[WindowsVolume]Myapp" />
<Directory Id="TARGETDIR" Name="SourceDir">
  <Directory Id="INSTALLFOLDER" Name="Myapp">
    <Directory Id="Myapp_Installer_Dir" Name="Myapp">
          <Directory Id="BIN" Name="Bin" />
          <Directory Id="ICONS" Name="Icons" />
    </Directory>
  </Directory>
</Directory>

Et puis j'ai obtenu ces définitions d'installation de fichiers:

<DirectoryRef Id="Myapp_Installer_Dir">
  <Component Id="INSTALLER_Myapp" Guid="{94F18477-8562-4004-BC6F-5629CC19E4CB}" >
    <File Source="$(var.Myapp.TargetPath)" KeyPath="yes"/>
  </Component>
</DirectoryRef>

<DirectoryRef Id="BIN">
  <Component Id="INSTALLER_Data" Guid="{545FB5DD-8A52-44D7-898E-7316E70A93F5}" >
    <File Source="$(var.Data.TargetPath)" KeyPath="yes"/>
  </Component>
    ...

Et cela continue de cette manière. Les fichiers du répertoire "ICONS" sont également définis.

J'utilise également la boîte de dialogue WixUI_InstallDir et j'ai également ces lignes présentes:

<Property Id="WIXUI_INSTALLDIR" Value="Myapp_Installer_Dir" />
<UIRef Id="WixUI_InstallDir" />

Le problème est que lorsque l'utilisateur installe le programme et modifie la valeur du dossier d'installation, les fichiers de la "Corbeille" et des "Icônes" sont installés dans leur chemin d'accès correct, mais la cible Myapp est installée à un emplacement fixe qui a été défini à le démarrage comme chemin d'installation par défaut.

Pourquoi seuls les fichiers bin et icon sont-ils installés dans le dossier correct que l'utilisateur voulait, mais pas la cible myapp?

18
Yonatan Nir

J'ai enfin compris le problème. Après avoir cherché un moment, je suis tombé sur ce document:

Ensemble de boîtes de dialogue WixUI_InstallDir

La partie pertinente: "L'ID de répertoire doit être composé de tous les caractères majuscules car il doit être transmis de l'interface utilisateur à la séquence d'exécution pour prendre effet."

Et comme vous pouvez le voir dans mon code: "Myapp_Installer_Dir" ne répond pas à ces critères.

Après l'avoir changé en "MYAPPINSTALLERDIR", tout a fonctionné.

36
Yonatan Nir

Je ne suis pas sûr, mais c'est ce qui, je pense, s'est produit.

Lorsque vous créez un élément SetDirectory, vous ajoutez essentiellement une action personnalisée qui définit un répertoire dans la base de données MSI. Tant que vous ne spécifiez pas la séquence dans laquelle il est exécuté, il est par défaut both, ce qui signifie exécuter dans les deux InstallUISequence et InstallExecuteSequence.

Désormais, lorsqu'un utilisateur modifie le répertoire d'installation dans l'assistant, cela se produit dans la séquence d'interface utilisateur. Évidemment, lorsque l'installation entre dans la séquence d'exécution, la valeur de INSTALLFOLDER est définie sur [WindowsVolume]Myapp selon les instructions.

Donc, vous devez retravailler cela d'une manière ou d'une autre. Gardez également à l'esprit l'installation silencieuse - il n'y a que la séquence d'exécution.

UPDATE au lieu de ce que vous avez, essayez quelque chose comme ceci:

<Directory Id="TARGETDIR" Name="SourceDir">
  <Directory Id="WindowsVolume">
    <Directory Id="INSTALLFOLDER" Name="Myapp">
      <Directory Id="BIN" Name="Bin" />
      <Directory Id="ICONS" Name="Icons" />
    </Directory>
  </Directory>
</Directory>

Et laissez l'utilisateur modifier facultativement le INSTALLFOLDER comme vous le faites maintenant.

3
Yan Sklyarenko