[Deploy] Transformaciones de .config (I): Web.config

Cuando se desarrolla una aplicación sea del tipo que sea, siempre se incluye un fichero .config donde aparecen datos de la configuración (settings, cadenas de conexión, configuración de dlls, versiones específicas de dlls, etc). Si estamos en una aplicación web tendremos un fichero web.config y si estamos en otro tipo de aplicación se llamará app.config.

Creando entornos

Normalmente en web se trabajan con múltiples entornos al desplegar. Podemos disponer de un entorno de desarrollo, de un entorno de QA/test, de un entorno de preproducción y finalmente de un entorno de producción. Normalmente a cada entorno se corresponde una configuración de despliegue distinta, porque tendrán settings o cadenas de conexión distintas.

Cuando creamos un proyecto web, automáticamente nos genera un web.config. Sin embargo podemos apreciar que nos genera dos ficheros: uno para Debug y otro para Release:

image

Lo cual en el csproj se traduce de la siguiene forma:

<Content Include="Web.Debug.config">

  <DependentUpon>Web.config</DependentUpon>

</Content>

<Content Include="Web.Release.config">

  <DependentUpon>Web.config</DependentUpon>

</Content>

Y para generar esos ficheros, la plantilla de VS se basa en la configuración de la solución que exista. Por defecto se crean dos configuraciones: debug y release para cada uno de los proyectos integrados en la solución:

image

Lo cual nos permite crear rápidamente tantas configuraciones como necesitemos. Además, podemos crearlas basándonas en otras ya existentes:

image

Y una vez creadas, nos situamos encima de Web.Config y ya Visual Studio nos sugiere que podemos añadir nuevas configuraciones:

image

image

A partir de este momento, cuando se publique la aplicación se aplicará la transformación de web.config a la configuración seleccionada. Es decir, los efectos del web.config sólo tienen validez una vez se ha desplegado la aplicación, por lo que no es posible probarlo si desde el propio Visual Studio cambiamos la configuración al ejecutar/probar.

Transformaciones

Si disponemos de un web.config base,compilamos y desplegamos con una solución determinada (Debug, Release o cualquier otra que se haya creado de forma previa) este se transformará. ¿Cómo? Si se presta atención al csproject del proyecto, se importa una extensión de msbuild:

<Import

Project="$(MSBuildExtensionsPath32)MicrosoftVisualStudiov10.0WebApplicationsMicrosoft.WebApplication.targets" 

Condition="false" />

 

Esta extensión permite que después de la compilación, se aplique el web.config original y después se apliquen las transformaciones que se hubieran definido en la configuración específica de cada entorno.

Pero ¿qué es una transformación? Es una alteración del web.config base para insertar, eliminar o modificar parte de la estructura del XML. Véase en detalle una configuración de Release por ejemplo:

<configuration xmlns:xdt="http://schemas.microsoft.com/XML-Document-Transform">

  <system.web>

    <compilation xdt:Transform="RemoveAttributes(debug)" />

  </system.web>

</configuration>

Véase el uso del namespace de XML-Document-Transform. Este habilitará las instrucciones necesarias para las trasformaciones. Las más comunes suelen ser las relativas a la substitución de un atributo XML, añadir un nuevo nodo o reemplazarlo por otro. Los atributos que se usarán serán los siguientes:

  • Transform: Indica la naturaleza de la operación: Replace, Insert, InsertIfNotExists, etc.
  • Locator: Si necesitamos localizar el nodo para una sustitución, se indicará aquí el nombre del atributo que se usará a tal efecto.

Por ejemplo, si se tiene una sección de appsettings en el web.config base tal que:

<appSettings>

  <add key="environmentName" value="none" />

</appSettings>

En un hipotético web.QA.config sería del siguiente modo:

<appSettings>

  <add key="environmentName" value="QA" 

    xdt:Transform="Replace" 

    xdt:Locator="Match(key)" />

</appSettings>

En el cual indicamos en Transform que se desea aplicar un Replace en aquel nodo cuyo atributo Key sea “environmentName”. Así al publicar la aplicación en con la configuración de QA, se aplicarará esa transformación.

También se puede reemplazar un nodo completo, en cuyo caso no se indicaría el atributo locator. Mientras que en un web.config base no aparece este nodo, podemos insertarlo en cuaquier transformación:

<system.webServer >

    <applicationInitialization xdt:Transform="Insert" >

      <add initializationPage="/Static/QAAdvice"/>

    </applicationInitialization>

</system.webServer>

O incluso insertar un nodo completo:

...

<system.diagnostics xdt:Transform="Insert">

  <trace>

    <listeners>

      <add type="Microsoft.WindowsAzure.Diagnostics.DiagnosticMonitorTraceListener, Microsoft.WindowsAzure.Diagnostics, Version=2.5.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" name="AzureDiagnostics">

        <filter type="System.Diagnostics.EventTypeFilter" initializeData="Warning"/>

      </add>

    </listeners>

  </trace>

</system.diagnostics>

configuration>

De este modo se puede configurar cada entorno y configuración y que se apliquen los cambios correspondientes.

Si quiere conocer más a fondo las transformaciones de XML para proyectos web, consulte este enlace.

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *