Dans la dernière version de ASP.NET, une fonctionnalité vraiment pratique est apparue : la transformation XML du fichier web.config
.
C’est une fonctionnalité toute bête et pourtant très pratique : elle permet de modifier le fichier de configuration en fonction de l’environnement cible utilisé pour la compilation / publication du projet.
La mise en œuvre est simple, il suffit d’ajouter au projet des fichiers web.[environnement_cible].config
et d’inclure dans ces fichiers les instructions de modification (ajout de clés, changements de valeurs, suppression de clés).
Malheureusement, cette fonctionnalité n’est pas disponible pour les applications lourdes (WinForm, WPF) et leur App.Config
. Enfin, pas nativement.
En effet, la structure du fichier est proche et tout ce qui est fait, c’est simplement modifier des éléments d’une structure XML, rien d’extraordinaire et il n’y a donc pas de raison que ce ne soit pas possible. Donc même si l’interface de la Visual Studio ne fournit pas ces fonctionnalités, il existe forcément un moyen !
Bon apparemment, il en existe même plusieurs car dans mes recherches j’ai croisé plusieurs plugins Visual Studio ou billets de blog expliquant l’une ou l’autre technique. J’en ai essayé plusieurs sans succès (certaines ne fonctionnent pas avec tous les modes de publication, notamment ClickOnce).
Voici une solution que j’utilise quotidiennement sur un projet donc qui semble fonctionner, même avec ClickOnce. La solution est fournie par le billet de ExceptionalCode dont je me suis fortement inspiré pour cet article.
Ajouter le support des transformations XML dans un projet non Web
Toute la magie réside dans le projet MSBuild (AppConfig.Transformation.targets / Copie locale du fichier au 10/01/2012) créé par João Angelo de ExceptionalCode.
MàJ : Comme expliqué ici, ce fichier ne fonctionne pas avec la Visual Studio 2010 SP1, pour cette version, il faut utiliser un autre fichier, corrigé par le même auteur : AppConfig.Transformation.targets / Copie locale du fichier au 03/01/2013).
Il faut donc ajouter ce fichier au projet, pour cela il faut éditer le fichier du projet de démarrage:
- Faire un clic-droit sur le projet en question et choisir
Décharger le projet
(Unload Project
) - Toujours sur le même projet, faire à nouveau un clic-droit et choisir
Editer [nom du projet]
. Cette action va ouvrir le fichier XML du projet et permettre son édition. - Effectuer les modifications suivantes :
Avant modification :... <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" /> <Target Name="BeforeBuild"> </Target> <Target Name="AfterBuild";> </Target> </Project>
Après modification :
... <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" /> <Import Project="..\Librairies\AppConfig.Transformation.targets" /> <Target Name="BeforeBuild"> </Target> <Target Name="AfterBuild"> </Target> </Project>
Ici je considère que le fichier
AppConfig.Transformation.targets
se trouve dans un répertoireLibrairies
à la racine de la solution, dans le répertoire parent du projet.
Et voilà, il ne reste plus qu’à créer un fichier de configuration pour chaque environnement cible, en respectant le format de nommage App.[environnement_cible].config
comme ici :
Par contre, en suivant la procédure jusqu’ici, par défaut la Visual Studio n’affiche pas les différents fichiers App.[env].config
de manière hiérarchique comme c’est le cas sur la capture d’écran ci-dessus.
Pour cela, il faut :
- Repasser en mode édition XML du fichier du projet (comme déjà fait dans la section précédente)
- Repérer les déclarations pour les fichiers
App.[env].config
, par exemple :<None Include="App.Debug.config" />
- Pour chaque fichier de configuration (sauf
App.config
bien sûr), il faut ajouter un sous-élément indiquant que ce fichier est dépendant deApp.config
<None Include="App.Debug.config"> <DependentUpon>App.config</DependentUpon> </None>
Lorsque le projet sera rechargé, tous les fichiers de configuration seront bien affichés de manière hiérarchique sous App.config
.
Les instructions de modification à mettre dans ces fichiers sont détaillées ici et seront peut-être l’objet d’un autre billet.
This doesn’t work for VS 2010 SP1.
The target file has been updated to correct that : http://exceptionalcode.wordpress.com/2011/02/25/vs-2010-sp1-beta-app-config-xml-transformation-fix/