Comment créer un installeur avec Visual Studio 2012 et Wix ?

Comment faisait-on avant ?
Avant la version 2012 de Visual Studio, il n’était pas rare de croiser des projets de déploiement du type « Programme d’installation de Visual Studio ». Evidemment, il existait d’autres alternatives, comme InstallShield qui était proposé nativement.
Le projet d’installation proposé par Visual Studio a le mérite d’être simple et rapide à implémenter mais surtout d’être proposé gratuitement. Ce dernier point est, comme nous pouvons le remarquer au quotidien, un élément fortement apprécié dans la réalisation d’un projet.
Par contre, cette solution a deux énormes inconvénients à l’heure actuelle :
- Le projet impose d’utiliser Visual Studio pour être compilé (ça fait tâche sur un serveur de build…),
- Ce type de projet a été tout simplement abandonné à partir de Visual Studio 2012 !
Comment fait-on ? Allez-vous me dire. Il vous reste la solution InstallShield, seule alternative proposée par Visual Studio 2012 :
Si l’on avait fait le choix d’InstallShield auparavant, aucun problème. Par contre pour l’installeur de Visual Studio : adieu votre beau projet… ou pas !
Le projet Wix
Nous arrivons dans le vif du sujet, il existe bien une alternative à ce vide laissé par la suppression de l’installeur Visual Studio : le projet Wix.
Wix est un projet open source sous licence CPL publié par Microsoft lui-même ! Vous avez bien entendu. Vous avez la possibilité de récupérer le code source sur CodePlex :
http://wix.codeplex.com/SourceControl/latest
Pour utiliser Wix avec Visual Studio 2012 (ou une version antérieure), il vous suffit d’installer la dernière version stable (3.7 au moment où cet article est écrit) à partir du site officielle :
http://wixtoolset.org/releases/
Une fois Wix installé sur votre machine, si l’on retourne sous Visual Studio 2012 on remarque l’apparition d’une nouvelle famille de projets : Windows Installer XML (WIX).
Lorsque l’on ajoute un « Setup Project » à notre solution, Wix nous crée un fichier « wxs » contenant la définition de notre installeur en XML :
<!--?xml version="1.0" encoding="UTF-8"?--> <wix xmlns="<a href=" http:="" schemas.microsoft.com="" wix="" 2006="" wi"="">http://schemas.microsoft.com/wix/2006/wi"> <product id="*" name="SetupProjectCellenza2012" language="1033" version="1.0.0.0" manufacturer="" upgradecode="1b460ae2-7511-4e98-94b3-b40bd5138e92"> <package installerversion="200" compressed="yes" installscope="perMachine"> <majorupgrade downgradeerrormessage="A newer version of [ProductName] is already installed."> <mediatemplate> <feature id="ProductFeature" title="SetupProjectCellenza2012" level="1"> <componentgroupref id="ProductComponents"> </componentgroupref></feature> </mediatemplate></majorupgrade></package></product> <fragment> <directory id="TARGETDIR" name="SourceDir"> <directory id="ProgramFilesFolder"> <directory id="INSTALLFOLDER" name="Cellenza2012"> </directory> </directory> </directory></fragment> <fragment> <componentgroup id="ProductComponents" directory="INSTALLFOLDER"> <!-- TODO: Remove the comments around this Component element and the ComponentRef below in order to add resources to this installer. --> <!-- <Component Id="ProductComponent"> --> <!-- TODO: Insert files, registry keys, and other resources here. --> <!-- </Component> --> </componentgroup> </fragment> </wix>
Au premier abord cela peut faire peur, mais on s’y fait très vite. Il faut commencer par renseigner les champs vides tels que « Manufacturer » ou encore l’ID de la balise « Product ».
Pour l’instant notre installeur ne fait que créer des dossiers vides, ce qui n’est pas très intéressant. Ajoutons des fichiers provenant de notre solution. Pour cela il nous faut ajouter une référence vers les projets désirés :
Une fois la source référencée, il faut déclarer les fichiers que l’on souhaite installer :
<fragment> <componentgroup id="ProductComponents" directory="INSTALLFOLDER"> <!-- TODO: Remove the comments around this Component element and the ComponentRef below in order to add resources to this installer. --> <component id="ProductComponent"> <!--TODO: Insert files, registry keys, and other resources here.--> <file source="$(var.HelloCellenza2012.TargetDir)\HelloCellenza2012.exe"> </file></component> </componentgroup> </fragment>
Vous remarquerez l’utilisation de la variable $(var.HelloCellenza2012.TargetDir) qui permet de récupérer directement le dossier de sortie du projet.
Notre installeur est désormais fonctionnel. Néanmoins il reste quelques points à améliorer.
Par défaut, un fichier « cab » est généré mais n’est pas embarqué dans le MSI. Pour corriger cela il vous suffit d’ajouter l’élément « EmbedCab » dans la balise « MediaTemplate » :
<mediatemplate embedcab="yes">
Ensuite, notre installeur ne possède pas d’interface utilisateur par défaut. Pour cela il suffit d’ajouter les balises suivantes dans l’élément « Product »:
<uiref id="WixUI_InstallDir"> <property id="WIXUI_INSTALLDIR" value="INSTALLFOLDER">
Où INSTALLFOLDER correspond à l’identifiant du dossier d’installation.
Attention, pour utiliser l’interface graphique vous devez ajouter une référence vers la librairie graphique :
Au final cela nous donne le fichier WXS suivant :
<!--?xml version="1.0" encoding="UTF-8"?--> <wix xmlns="http://schemas.microsoft.com/wix/2006/wi"> <product id="E69A41DA-A89D-424A-85DA-473CA3AA160F" name="HelloCellenza2012" language="1033" version="1.0.0.0" manufacturer="Cellenza" upgradecode="1b460ae2-7511-4e98-94b3-b40bd5138e92"> <package installerversion="200" compressed="yes" installscope="perMachine"> <mediatemplate embedcab="yes"></mediatemplate></package></product></wix> <majorupgrade downgradeerrormessage="A newer version of HelloCellenza is already installed."></majorupgrade> <feature id="ProductFeature" title="SetupProjectCellenza2012" level="1"> <componentgroupref id="ProductComponents"> </componentgroupref></feature> <uiref id="WixUI_InstallDir"> <property id="WIXUI_INSTALLDIR" value="INSTALLFOLDER"></property></uiref> <fragment> <directory id="TARGETDIR" name="SourceDir"> <directory id="ProgramFilesFolder"> <directory id="INSTALLFOLDER" name="Cellenza2012"> </directory> </directory> </directory></fragment> <fragment> <componentgroup id="ProductComponents" directory="INSTALLFOLDER"> <!-- TODO: Remove the comments around this Component element and the ComponentRef below in order to add resources to this installer. --> <component id="ProductComponent"> <!--TODO: Insert files, registry keys, and other resources here.--> <file source="$(var.HelloCellenza2012.TargetDir)\HelloCellenza2012.exe"> </file></component> </componentgroup> </fragment>
Vous avez la base pour créer votre installeur, vous avez la possibilité de le personnaliser un maximum comme ajouter des raccourcis, des contraintes d’installation, des actions personnalisées (avec pourquoi pas une dll externe), choisir les fenêtres de l’installeur… Bref, la liste est longue et mérite un autre article ;).
Pour finir, contrairement à l’installeur de Visual Studio :
- Wix est compatible avec Visual Studio 2012 (et versions antérieures)
- Wix est compilable avec MSBuild
De plus, il existe des plugins sur le marché permettant de migrer votre installeur vdproj vers un projet Wix.
hello j’ai suivi le tuto a la lettre mais pas moyen de voir apparaitre wix dans microsof visual studio express 2012 ?
Il y’a une extension de wix que vous devez installer dans visual studio
Peut ton partir d’un soft déjà codé pour créer un .msi ?
Créer un MSI pour un projet Visual Studio existant? oui bien évidemment, il vous faut juste ajouter le projet WIX à votre solution.
Merci, très pratique pour débuter sans être rebuté
Merci pour cet article, je le conseillerais vivement !