Jan 06

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épertoire Librairies à 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 de App.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.

One Response to “[.Net] Transformations XML de App.config”

  1. kg dit :

    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/

Leave a Reply


*/ ?>