juin 04 2010

[Visual Studio 2010] Déploiement Web Partie 5 - Transformation de fichier Web.Config

Suite de la série de billets sur le déploiement Web avec Visual Studio 2010 :

Le déploiement d'applications, notamment Web, comporte toujours une phase de configuration. De nombreux paramètres sont propres à l'environnement d'exécution : on n'utilisera pas la même base de données ou le même compte applicatif sur l'environnement de production que sur celui de développement. Les fichiers Web.config comprennent généralement des paramètres qui doivent être différents selon l'environnement. Par exemple, vous pourriez avoir à effectuer les modifications suivantes lorsque vous déployez un fichier Web.config sur un serveur :

  • changer une chaîne de connexion de base de données pour pointer vers la base de données du serveur de destination ;
  • désactiver le débugage de l'environnement de production (pensez toujours à le faire, surtout pour les performances des applications ASP.NET !) ;
  • supprimer les informations sensibles telles que les chaînes de connexion.
 

Pour gérer manuellement ces modifications à apporter au fichier Web.config lors d'un déploiement, vous pouvez effectuer les opérations suivantes:

  • modifier le fichier Web.Config sur le serveur de destination chaque fois que le projet est déployé ;
  • maintenir des versions séparées du fichier Web.config pour chaque environnement, et copier uniquement la version qui convient à l'environnement de destination lorsque vous déployez ;
  • créer des fichiers XSLT pour transformer le fichier Web.config et appliquer les transformations une fois le projet déployé.
 

Après avoir été longtemps manuelles, les étapes citées plus haut sont devenues plus ou moins automatisées par des outils tiers. Cependant, tous ces outils ne sont pas forcément accessibles à tous les développeurs. Avec l'arrivée de Visual Studio 2010, les choses changent ! Il est désormais possible de définir des "profils" de Web.Config, et de les utiliser pour transformer automatiquement les Web.Config de l'application durant un déploiement. Ainsi on peut désormais générer automatiquement un fichier de config pour chaque environnement différent. Pour les projets d'applications Web, ASP.NET fournit des outils qui automatisent le processus de transformation des fichiers Web.Config quand ils sont déployés. Pour chaque environnement que vous souhaitez déployer, vous créez un fichier de transformation qui ne spécifie que les différences dans le fichier Web.Config pour cet environnement. L'arrivée de la transformation des fichiers Web.Config était très attendue des développeurs Web. Pour aider à mettre en place des déploiements (automatiques ou non) basés sur des lignes de commande, ce modèle de transformation est implémenté comme une tâche MsBuild.

 

Fonctionnement

Nous allons voir ici un bref aperçu du fonctionnement de la transformation des fichiers Web.Config. Le concept est relativement simple, habituellement vous avez un seul fichier Web.config pour une Web Application. C'est toujours le cas, mais vous pouvez désormais ajouter un fichier de transformation par serveur de destination désiré. Exemple : vous avez un serveur UAT et un serveur de PROD, vous pourrez alors ajouter à votre solution ces deux fichiers : Web.UAT.Config et Web.PROD.Config. Ensuite, le moteur de transformation XML se chargera de générer à partir de votre fichier Web.config original et transformation (UAT ou PROD), un fichier Web.Config transformé propre au serveur de destination choisi. Le schéma suivant résume ce principe :


Le fichier de transformation doit avoir le namespace Transformation spécifié dans le noeud de configuration comme indiqué ci-dessous :


 

Le namespace XML Document Transformation introduit deux nouveaux attributs qu'il est nécessaire de connaître pour utiliser la transformation de fichier Web.Config : l'attribut Transformation et l'attribut Locator. Ces deux namespaces portent bien leur nom :

  • Transformation informe le moteur de transformation sur la façon de modifier le fichier Web.Config original pour un serveur de destination précis. On peut notamment à l'aide de cet attribut : remplacer, insérer ou supprimer un noeud. On peut également supprimer ou modifier des attributs ;
  • Locator informe le moteur sur le noeud exact pour lequel la transformation doit être appliquée. On peut utiliser XPath ou bien une condition pour trouver un noeud.

 

Exemple

Par défaut, pour une Web Application, Visual Studio 2010 va créer un fichier Web.Debug.Config et un fichier Web.Release.Config. Dans cet exemple, nous allons créer un fichier de transformation pour notre environnement UAT. Pour ce faire, il faut déjà créer un configuration propre à l'UAT, donc aller dans le menu Build puis sélectionner Configuration Manager :


 

Enfin, pour rajouter un fichier de transformation propre à l'UAT, un clic droit sur la Web Application dans Visual Studio 2010, puis "Add Config Transforms" comme le montre l'image suivante :


 

Pour notre exemple, nous allons transformer la chaîne de connexion ainsi qu'un AppSetting avec les valeurs propres à notre serveur UAT. Voici les parties qui nous intéressent dans le fichier Web.Config original :


 

Dans notre fichier de transformation Web.UAT.Config, nous allons utiliser les deux attributs Transformation et Locator pour modifier la chaîne "ApplicationServices", ainsi que l'AppSetting "MonAppSetting". Ci-dessous, le fichier de transformation utilisé pour faire cela. Vous remarquez que c'est simple à mettre en place.


 

Si nous analysons le code précédent, nous pouvons remarquer que la transformation utilisée ici est "Replace", celle-ci indique au moteur de transformation de remplacer le noeud entier. De même, la localisation utilisée ici est "Match", celle-ci informe le moteur de transformation que parmi toutes les nœuds “configuration/connectionStrings/add” que l'on trouve, il faut trouver dans Web.UAT.Config le nœud dont le nom correspond.

Notez également que le fichier de transformation contient uniquement les nœuds pour lesquels une transformation est désirée. Tout le reste est absent du fichier de transformation et sera repris directement dans le fichier Web.Config. Cela facilite grandement la tâche et nous évite de devoir tenir à jour tous les fichiers de transformation dès qu'une modification intervient dans le fichier Web.Config. Notez également que l'exemple indique comment remplacer une chaîne de connexion ou une AppSetting, mais vous pouvez faire bien plus : ajouter, renommer ou supprimer des éléments

Pour générer votre fichier Web.Config pour le déploiement, rien de plus simple : ouvrez le Visual Studio Command prompt, saisissez "MSBuild 'Path to Application project file (.Csproj/.VbProj)' /t:TransformWebConfig /p:Configuration=UAT" et validez pour obtenir ceci :


 

Une fois la transformation du fichier Web.Config pour l'environnement UAT finie, le fichier Web.Config résultant sera disponible dans le répertoire obj/UAT de votre projet. Vous pouvez ainsi l'utiliser pour déployer votre application sur l'environnement UAT.

Pour aller plus loin et connaître la syntaxe des différentes opérations offertes par la transformation de fichier Web.Config, je vous invite à consulter la documentation MSDN. On pourra citer notamment les opérations suivantes avec le namespace Locator :

  • Condition : pour spécifier une expression XPath qui est combinée à l'expression XPath de l'élément courant. Les éléments qui correspondent à l'expression sont sélectionnés ;
  • Match : pour sélectionner un ou des éléments dont la valeur correspond pour un ou plusieurs attributs. Si plusieurs attributs sont spécifiés, seuls les éléments dont tous les attributs correspondent sont sélectionnés ;
  • XPath : pour spécifier une expression XPath qui sera appliqué au fichier Web.Config original. À différencier de "Condition" vu précédemment.

Les opérations suivantes sont proposées par le namespace Transform :

  • Replace : pour remplacer le ou les éléments sélectionnés avec l'élément spécifié dans le fichier de transformation ;
  • Insert : pour insérer l'élément qui est spécifié dans le fichier de transformation à la collection d'éléments de l'élément courant ;
  • InsertBefore : même chose que Insert, mais pour une insertion avant l'élément courant dans la collection ;
  • InsertAfter : même chose que Insert, mais pour une insertion après l'élément courant dans la collection ;
  • Remove : pour supprimer l'élément sélectionné. Si plusieurs éléments sont sélectionnés, seul le premier est supprimé ;
  • RemoveAll : pour supprimer tous les éléments sélectionnés ;
  • RemoveAttributes : pour supprimer les attributs spécifiés pour l'élément sélectionné ;
  • SetAttributes : pour assigner des valeurs aux attributs des éléments sélectionnés ;
  • XSLT : pour appliquer un fichier XSLT aux éléments sélectionnés.
 

Comme vous pouvez le constater les namespaces Locator et Transform permettent, grâce aux différentes opérations et à l'utilisation d'expression XPath, de transformer facilement votre fichier Web.config.

Tags: , , , , , , ,

Les commentaires sont clos