Génération du fichier Web.config avec Visual Studio

ASP.net MVC3La composition automatique du fichier Web.config en fonction des informations du gestionnaire de configurations est l’une des fonctionnalités pratique d’ASP.net  et de Visual Studio.

En effet, au moment de déployer votre projet, Visual Studio merge les informations du fichier de configuration correspondant avec le fichier web.config. Ainsi, il est très facile de personnaliser chaque élément du fichier en fonction de la cible visée. Une série de commandes sont à votre disposition : Replace, Remove, AddBefore, AddAfter… toutes ces commandes sont expliquées en détail sur la page MSDN dédiée.

Cibles du gestionnaire de configuration Fichier Web.config et ses versions ciblées

Oui, mais seulement, cette fonctionnalité n’est pas disponible lorsque l’on teste l’application à partir de Visual Studio, c’est-à-dire que vous vous retrouvez toujours avec le fichier de configuration par défaut (Web.config). Ce qui pourrait être très pratique,  c’est de pouvoir créer un fichier de configuration par environnement (Dev, Beta, PreProd, Release) avec pour chacun les chaines de connexion aux bases de données… et au lancement projet, ou à la compilation, Visual Studio pourrait composer le fichier de configuration correspondant.

Pour cela, et après quelques recherches, j’ai utilisé MSBuild et j’ai modifié le fichier du projet ASP.net. Plus précisément, j’ai ajouté dans la cible « BeforeBuild » des instructions adéquates, ainsi avant chaque compilation, la configuration sera mise à jour ! Je vous propose donc d’éditer votre fichier projet (.csproj) avec votre éditeur de texte préféré et d’ajouter le code suivant :

<Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
<Import Project="$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v10.0\WebApplications\Microsoft.WebApplication.targets" />
<UsingTask TaskName="TransformXml" AssemblyFile="$(MSBuildExtensionsPath)\Microsoft\VisualStudio\v10.0\Web\Microsoft.Web.Publishing.Tasks.dll" />
<PropertyGroup>
<TransformInputFile>$(ProjectDir)web.temp.config</TransformInputFile>
<TransformFile>$(ProjectDir)web.$(Configuration).config</TransformFile>
<TransformOuputFile>$(ProjectDir)web.config</TransformOuputFile>
<TempWebConfig>$(ProjectDir)web.temp.config</TempWebConfig>
</PropertyGroup>
<ItemGroup>
<OriginalWebConfig Include="web.Master.config" />
</ItemGroup>
<Target Name="BeforeBuild">
<Message Importance="high" Text="============================================" />
<Message Importance="high" Text="Transform web.config for '$(Configuration)' configuration" />
<Delete Files="@(TempWebConfig)" />
<Copy SourceFiles="@(OriginalWebConfig)" DestinationFiles="$(TempWebConfig)" />
<TransformXml Source="$(TransformInputFile)" Transform="$(TransformFile)" Destination="$(TransformOuputFile)" StackTrace="$(StrackTraceEnabled)" />
<Message Importance="high" Text="============================================" />
</Target>

Malheureusement, le fichier Web.config devient dynamique et donc inutilisable !

Oui, puisqu’il est composé automatiquement à la compilation, toutes les informations qu’il contient sont réécrites, c’est pourquoi j’utilise un autre fichier que j’ai nommé Web.Master.config, ce dernier est en fait une copie de l’ancien Web.config.

Et voilà ! Votre projet utilise maintenant un fichier de configuration dynamique qui s’adaptera automatiquement à l’environnement ciblé !

Nombre de vue : 177

COMMENTAIRES 1 commentaire

  1. Je ne connaissais pas cette technique, qui bien pratique, mais ca reste un éceuil pour ceux qui passent après nous.. La magie c’est bien, la magie ponctuelle c’est mal.
    On devrait pouvoir écrire #if DEBUG … #endif dans les *.config
    De même, je ne comprend pas pourquoi MS refait l’IHM de VS à chaque version alors qu’on ne peut toujours pas renommer un projet convenablement…
    Ils ont des priorités bizarres ces gens là!

AJOUTER UN COMMENTAIRE