WIX (Windows installer XML) est un outil pour créer des installeurs.

Nous allons nous intéresser à la création d''un installeur qui déploie un site Web dans IIS en créant l''application pool et l''application Web. Nous créerons cet installeur dans Visual Studio.
Le code source est joint à cet article.

Création d’une nouvelle solution

Tout d''abord, il faut installer WIX pour Visual Studio : http://wixtoolset.org/releases/
Une fois que WIX est installé, de nouveaux templates de projet sont disponibles dans Visual Studio dans la rubrique Windows Installer XML :

Pour notre exemple, nous allons sélectionner « Setup Project ».
Une fois la solution créée, on peut voir le fichier Product.wxs qui est le point d’entrée de notre installeur.
La première chose à faire est de renseigner l’attribut Manufacturer. S’il reste vide, il y aura une erreur à la compilation.

Création du site Web

Pour plus de clarté, nous allons créer un nouveau fichier pour le paramétrage du site. Ajoutons un nouvel élément de type « Installer File », qu’on va appeler IisSettings :

 

 Avant d’écrire quoique ce soit dans ce nouveau fichier, il faut définir le répertoire dans lequel nous allons déployer le site web.

Revenons sur le fichier Product.wxs. Tous les répertoires à déployer doivent être référencés dans l’élément . On peut voir que par défaut, il y a un répertoire qui sera créa dans « Program Files ». L’id ProgramFilesFolder est un Id de référence dans WIX. Pour notre déploiement nous allons devoir créer nos propres ID comme ceci :


Dans l’attribut name, on définit un répertoire. Ici, l’Id SiteWebDemoId pointe sur C:inetpubwwwrootSiteWebDemo

Maintenant qu’on a notre répertoire, on peut revenir sur le fichier IisSettings. Nous allons y écrire les commandes de création d’une application pool et d’une application web dans IIS :

    

  

La première chose à faire, est de référencer un répertoire :
Nous référençons le répertoire indiqué dans le fichier product.wxs
Ensuite nous définissons des composants : DemoAppPoolCmp et SiteWebDemoCmp. Chaque composant doit avoir un Guid.
Le premier composant crée l’application pool. Nous y définissons son nom, son mode et son identité.
Le second composant crée l’application web. Nous y définissons son nom, son application pool, son binding (WebAddress) et son mode d’authentification (WebDirProperties).
Pour que ces composants soient installés, il faut les mettre dans une "feature". Revenons sur le fichier product et ajoutons ceci :


Nous pouvons faire un premier test et voir que l’installeur nous crée bien une Application Pool nommée « Demo Application Pool », un site web nommé « Demo Site Web »  et un répertoire SiteWebDemo a été créer dans c:inetpubwwwroot.

Déploiement du contenu du site Web : 

Nous avons désormais un installeur qui nous crée un site web mais le contenu du répertoire est vide. Il est possible avec WIX de déclarer une référence à un autre projet de la solution mais ça ne fonctionne que pour une application Windows ou un service Windows car l’installeur ne prendra que le contenu du répertoire bin du projet. Ce qui ne sert à rien pour un site web, nous voulons déployer tout le contenu du site web.

Pour cela, nous allons passer par des lignes de commande à mettre dans l’évènement prebuild de notre projet d’installation.

"C:\Windows\Microsoft.NET\Framework\v4.0.30319\msbuild" "$(SolutionDir)\MonsiteWeb\MonsiteWeb.csproj" /p:DeployOnBuild=true /p:PublishProfile=Install

Cette ligne de commande publie le site web à partir du fichier profile « Install » qu’il aura fallu préalablement créer sur le projet Web. Pour notre exemple, ce fichier de profile déploie le contenu du site dans un répertoire « Publish » situé au niveau de la solution.
Il faut ensuite paramétré le chemin dans lequel sera publié le site Web. Pour cela, dans le fichier Product.wxs, il faut ajouter une variable . Ceci permet de passer à la ligne de commande suivante.

call "C:\Program Files (x86)\WiX Toolset v3.7\bin\heat.exe" dir "$(SolutionDir)\Publish" -var wix.PublishSrc -dr SiteWebDemoId -cg SiteWebBinariesCmp -scom -sreg -sfrag –srd -o "$(SolutionDir)Installer\$(ProjectName).Binaries.wxs" –gg

Cette ligne de commande appelle l’exécutable heat.exe qui est un composant fourni par WIX. Ca génère un fichier wxs contenant tous les fichiers d’un répertoire.
Explication de cette ligne de commande :
* dir "$(SolutionDir)Publish" : Répertoire contenant les fichiers à déployer par l''installeur. La première ligne de commande doit déployer le site Web dans ce répertoire.
* -var wix.PublishSrc : le chemin de chaque fichier à déployer ne sera pas écrit en dur mais préfixé par une variable. Celle-ci passée en paramètre.
* -dr SiteWebDemoId : identifiant du répertoire dans lequel déployer le contenu du répertoire.
* -cg SiteWebBinariesCmp : identifiant du composant à déployer
* -o "$(SolutionDir)Installer$(ProjectName).Binaries.wxs" : chemin vers lequel créer le fichier wxs qui sera référencé par notre projet
* -gg : génère les GUID de chaque composant.

Lorsqu’on lance le build, on peut voir que le contenu du site web a été déployé dans le répertoire Publish. Dans le répertoire Installer, un fichier wxs est présent. Ce fichier référence tout le contenu du répertoire Publish. Vous pouvez voir dans ce fichier qu’il y a une référence à la variable PublishSrc définit préalablement dans le Product.wxs

Il faut désormais ajouter ce fichier wxs à la solution. Pour cela, clic droit sur le pojet puis ajouter un élément existant. Sélectionner le fichier et « ajouter en tant que lien »

Dans ce fichier, un groupe de composants est déclaré sous le nom SiteWebBinariesCmp. Il faut ajouter ce groupe dans une fonctionnalité pour que les fichiers du site web soient déployés. Pour cela, dans Product.wxs, on ajoute la ligne suivante dans l’élément « Feature » :

 Quand on compile, on peut voir dans le répertoire bin de notre projet WIX, qu’il y a un fichier msi et un fichier cab. Le setup plantera si le fichier cab n’est pas présent lors de l’installation. Pour que le fichier cab soit embarqué dans le setup, il faut ajouter l’attribut EmbededCab à yes dans l’élément Mediatemplate :

Interface utilisateur :

Avec ce qu’on a fait précédemment, le setup fonctionne mais aucune interface n’apparaît lors de l’installation. Le site est déployé, sans aucune information ou modification possible par l’utilisateur lançant le setup.

On va ajouter un fichier dans lequel définir les interfaces, on l’appellera UIDialogs. La description des interfaces est assez simple. Il suffit de définir un X, un Y, la hauteur et la largeur du control.

    

  

1 1 1 1 1 Renseignez le paramétrage du Proxy {\WixUI_Font_Title}Paramétrage IIS

Cette interface permet de saisir le nom de l'2014-02-20 17:02:35'Application Pool, le nom de l''application Web, le port et le chemin.

Il faut désormais la référencer pour que l''installeur sache quand l''appeler. On va créer un autre fichier qui fera ce travail :

    

  1

Les 2 premières références sont nécessaires au lancement de l''interface. DialogRef permet de référencer la fenêtre que nous avons créer et la dernière ligne précise qu''il faut notre fenêtre juste après l''écran de bienvenue.

Dernière référence, il faut ajouter dans le fichier product.wxs la ligne suivante :

Valeurs par défaut

 On peut définir des valeurs par défaut sur des propriétés. Pour certaines, c’est même obligatoire. Par exemple, pour un contrôle de type « PathEdit », s’il n’y a pas de valeur par défaut, l’installeur plante à l’exécution.

Ajoutons un fichier "Include File" dans notre projet :

 

Définissons ensuite des valeurs par défaut sur certaine de nos propriétés :


Pour utiliser ces valeurs, il faut les référencer sur l''attribut Property entre crochets. Par exemple, dans le fichier IisSettings définit plus haut, on peut indiquer la valeur par défaut du nom de l''application pool :


Conclusion

Depuis Visual Studio 2012, il n''est plus possible de créer des projets SetUp. WIX, nous permet d''avoir une solution à ce problème.

Il est possible d''aller plus loin dans l''installation avec par exemple du VBScript ou en développant des modules personnalisés en C#.

Liens :

http://wixtoolset.org/documentation/manual/v3/

http://wixtoolset.org/releases/

SetupExample.zip (12,58 kb)


Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *