WIX : retrouver les fichiers d'une application web à publier

WIX Toolset a beau être sympathique, il y a un travail qui est toujours un peu compliqué à réaliser. Il s’agit de l’automatisation de l’énumération des fichiers à installer, et la création du fichier wxs associé.

Par le passé, il était courant d’utiliser l’application Heat incluse dans le WIX Toolset. Celle-ci ne faisant plus partie de WIX 4, il faut apprendre à faire sans. Même si l'application unique WIX 4 permet de faire le même travail, cette approche n'est pas conseillée. Heureusement depuis déjà plusieurs années, il existe plusieurs tâches msbuild pour cela.

Ma préférence va à HarvestDirectory. Comme son nom l’indique, cette tâche va se charger de récupérer toutes les informations utiles à partir d’un dossier (liste de fichiers / dossiers, clé de registre pour l’enregistrement de composant COM, etc.). Le fichier wxs généré est déposé dans le dossier obj. Il est référencé par WIX lors de la build pour générer le fichier msi.

Mais si vous ne souhaitez pas transformer votre solution en usine à gaz (avec des scripts de partout, des chemins relatifs plus ou moins dynamiques, et des fichiers xml spécifiques pour msbuild, etc.), il convient de respecter quelques bonnes pratiques.

L’exemple qui suit vise à récupérer les fichiers d’une application web écrite en C#.

Les variables

Afin d'éviter de dupliquer les informations, il convient de créer des variables. Étant donné que nous allons jouer avec msbuild et WIX, les variables doivent exister dans les deux contextes.

Pour cet exemple, j’ai besoin d’une variable qui permettra de fixer le chemin relatif vers le dossier utilisé pour publier une application web. J’ai l’habitude de déposer mes projets dans un dossier Sources et de déposer mes fichiers de publication dans un dossier au même niveau. Celui-ci sera donc désigné par le chemin relatif " ..\..\Publish" (pour descendre de deux dossiers par rapport à mon projet WIX).

Je crée un PropertyGroup contenant ma variable WebAppDir et j’utilise la tâche DefineConstants afin de définir une variable WIX du même nom prenant sa valeur de la variable msbuild.

Exemple :


<PropertyGroup>
  <WebAppDir>..\..\Publish</WebAppDir>
  <DefineConstants>WebAppDir=$(WebAppDir)</DefineConstants>
</PropertyGroup>


La précompilation

La tâche HarvestDirectory doit être utilisée avant la build. Il faut donc créer une tache msbuild avec la cible BeforeBuild. Bien évidemment, il faut aussi que l’application web soit publiée dans le dossier WebAppDir défini un peu plus tôt.

Petite subtilité : pour fonctionner, HarvestDirectory doit être dans un ItemGroup.

Exemple :


<Target Name="BeforeBuild">
  <MSBuild Projects="..\MyWebApp\MyWebApp.csproj" Targets="WebPublish" Properties="Configuration=$(Configuration);Platform=$(Platform);DeployOnBuild=True;WebPublishMethod=FileSystem;publishUrl=$(WebAppDir);DeleteExistingFiles=True" />
  <ItemGroup>
    <HarvestDirectory Include="$(WebAppDir)">
      <DirectoryRefId>INSTALLFOLDER</DirectoryRefId>
      <ComponentGroupName>MyWebApp</ComponentGroupName>
      <PreprocessorVariable>var.WebAppDir</PreprocessorVariable>
      <SuppressRootDirectory>true</SuppressRootDirectory>
      <SuppressCom>true</SuppressCom>
      <SuppressRegistry>true</SuppressRegistry>
    </HarvestDirectory>
  </ItemGroup>
</Target>

Le composant MyWebApp peut alors être référencé parmi les features à installer.


Conclusion

Comme souvent, avec le WIX Toolset il faut savoir jouer avec msbuild. Rien de très compliqué. Il faut savoir prendre un peu de temps à apprivoiser msbuild et ainsi éviter de développer de véritables usines à gaz.

Jérémy Jeanson

Comments

You have to be logged in to comment this post.