Comment utiliser Windows Installer pour installer, et désinstaller proprement un dossier optionnel ?

L'un des aspects les plus importants quand on crée des MSI réside dans la désinstallation. Celle-ci doit respecter la maxime "Veuillez laisser cet endroit aussi propre que vous l'avez trouvé". Oui, cela fait penser à autre chose, et cela est volontaire.

Trop d'applications laissent des traces après leur passage. Cela peut être sous forme de fichiers, dossiers, ou clés dans la base de registre.

Avec Wix Toolset, les fichiers, dossiers, et clés de registre sont automatiquement supprimés lors de la désinstallation. Il y a cependant un cas problématique : les dossiers qui ne sont pas créés lors de l'installation. Windows Installer n'ayant pas connaissance de ceux-ci, il ne se permet pas de les supprimer. Si en plus, ces dossiers sont "optionnels", la gestion de leur présence, ou de leur absence lors de l'installation, et de la désinstallation se complique.

Avec Wix, il est possible de coder une action personnalisée pour l'installation, et une autre pour la désinstallation. Cette approche est un peu lourde pour ce que l'on a besoin de faire. Heureusement, il existe une solution plus simple. Il suffit de demander à Windows Installer de gérer un dossier vide comme étant l'un des composants de l'application.

Pour commencer, il faut déclarer le dossier. Pour mon exemple, je déclare un dossier MonDossierVide avec l'Id DOSSIER_VIDE.


<Fragment>
  <StandardDirectory Id="ProgramFiles6432Folder">
    <Directory Id="ManufacturerFolder" Name="!(bind.Property.Manufacturer)">
      ...
      <Directory Id="DOSSIER_VIDE" Name="MonDossierVide"/>
      ...
    </Directory>
  </StandardDirectory>
</Fragment>

Il faut ensuite déclarer un composant.


<DirectoryRef Id="DOSSIER_VIDE">
  <Component Id="ComposantDossierVide"
      Guid="{45D88591-3259-465D-AAAF-6248B7CCBD32}"
      Condition="UTILISER_DOSSIER_VIDE = 1">
      <CreateFolder />
  </Component>
</DirectoryRef>

Ce composant doit impérativement avoir :

  • une référence vers le dossier. Dans le cas présent, j'utilise un DirectoryRef pour cela, et je lui donne l'Id du dossier à créer. Exemple : DOSSIER_VIDE.
  • un Id défini. Exemple {45D88591-3259-465D-AAAF-6248B7CCBD32}.
  • un nœud CreateFolder.

Si en plus on ajoute une condition sur le composant, Windows Installer ne gérera le dossier que si la condition est respectée. Il ne créera le dossier que si la condition est vraie. Le dossier étant créé via un composant, il sera automatiquement supprimé lors de la désinstallation.

Bien évidemment, il faudra penser à référencer ComposantDossierVide dans liste des composants à installer.

Jérémy Jeanson

Comments

You have to be logged in to comment this post.