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.