Transformaciones sobre web.config: una forma de tener organizados los distintos ambientes

En el desarrollo de aplicaciones ASP.NET MVC puede haber un punto algo conflictivo si no lo tratamos con el debido cuidado: el archivo Web.config y las variantes del mismo en relación a los distintos ambientes de ejecución. Son muchos los casos donde se puede apreciar que hay problemas o confusiones asociadas a los cambios que uno debe tener sobre este archivo dependiendo del ambiente en el cual ejecutemos la aplicación.

Aquí es donde entran en juego las transformaciones sobre el Web.config, las cuales son un conjunto de reglas que podemos ir definiendo sobre el mismo. Mediante esas reglas podremos definir qué cambios se deben aplicar para cada ambiente.

Cuando hablamos de ambiente hacemos referencia al propósito del sitio donde se ejecute la aplicación, siendo los más clásicos:

  • Local: nuestra PC, ambiente de desarrollo al 100%
  • Testing: un sitio expuesto (interna o externamente) para hacer pruebas generales
  • Producción: sitio real de ejecución de nuestra aplicación

Dependiendo del proyecto podrán existir algunos más o menos (al menos tendremos el entorno local y el de producción). Para este post vamos a tomar esta configuración como la referencia.

Asumiendo que ya tenemos los perfiles de publicación necesarios para cada ambiente que no sea local, vamos a cada uno de los mismos (ubicados en Properties > PublishProfiles) y haciendo click derecho seleccionamos la opción que nos generará el archivo derivado Web.config para cada ambiente, donde se aplicarán las transformaciones particulares:

TransformacionConfig - AgregarConfig

Si presionamos el icono de apertura a la izquierda del Web.config veremos las distintas variantes disponibles del mismo, todas aplicando transformaciones sobre el base. Cada una de ellas estará como parte intermedia del nombre del archivo (ej.: Web.Testing.config). En la siguiente imagen se puede apreciar como queda el resultado luego de aplicar esto para los dos perfiles, el de testing y producción:

TransformacionConfig - ConfigsResultantes

Por defecto en una aplicación creada con el template de ASP.NET MVC tendremos ya dos variantes, Release y Debug.

Si abrimos uno de estos nuevos archivos creados veremos el siguiente contenido:

TransformacionConfig - ConfigInicial.jpg

En el mismo podemos apreciar algunas cosas, indicadas con los siguientes números:

  1. Sobre el elemento configuration definimos el esquema XML a utilizar para las transformaciones, denominado “xdt”.
  2. Sobre el elemento system.web > compilation vemos el uso por defecto de una transformación. En la misma se indica que remueva los atributos de un determinado modo de compilación, en este caso debug

Esto ya nos demuestra que hay algo de comportamiento nativo que utiliza ya las transformaciones. Una forma sencilla de ver los resultados de la aplicación de las mismas es haciendo click derecho sobre cada versión del Web.config y seleccionando la opción de previsualización:

TransformacionConfig - OpcionPrevisualizacion
Opción para previsualizar transformaciones

Lo siguiente que veremos es una ventana de diferencia de versiones, donde a la izquierda tendremos el Web.config original y a la derecha el resultante con las transformaciones aplicadas (ídem a cuando comparamos cambios desde el Team Explorer).

TransformacionConfig - TransformacionInicial
Previsualización de la transformación por defecto

Lo que debemos tener en claro es que tenemos dos atributos claves importados del esquema xdt, Transform y Locator:

  • Transform: indica la transformación puntual a realizar en el elemento que lo contiene.
  • Locator: indica la forma de localizar qué elemento debemos manipular.

Ahora veamos en detalle algunas transformaciones particulares que usualmente haremos:

Modificar atributos

Una de las situaciones que normalmente enfrentamos es la necesidad de tener distintos valores en nuestro entorno local y en el de Testing o Producción. Ante esto podemos usar el atributo Transform con el valor Replace.

Lo primero que haremos es agregar la clave isProduction sobre el appSettings, con el valor false por defecto. Pero que en el ambiente de Producción tenga valor true:

TransformacionConfig - AgregarClaveInicial

Para ello deberemos ir al archivo Web.Produccion.config y crear la definición de transformación asociada. Para el ejemplo que queremos lograr, el resultado es el siguiente:

TransformacionConfig - AplicarReplace
Reemplazo de elemento con xdt:Locator y xdt:Replace

Analicemos algunas cosas en detalle:

  1. Creamos la misma estructura de elementos que tenemos para el elemento a modificar.
  2. Agregamos la clave del elemento a modificar, y su nuevo valor.
  3. Definimos el atributo Locator con el valor “Match(key)“. Aquí lo que estamos indicando es que localice el elemento a reemplazar por una coincidencia exacta (key sensitive) de un atributo en particular, en nuestro ejemplo key.
  4. Definimos el atributo Transform con el valor “Replace(value)“, a través del cual indicamos que la transformación a aplicar es de reemplazo, y que el atributo sobre el cual realizarlo es value.

Si ejecutamos la previsualización sobre el archivo Web.Produccion.config podremos ver el resultado de la transformación, el cual es el esperado:

TransformacionConfig - ResultadoReplace
Resultado de modificar un atributo de un elemento

Modificar elementos

Aunque en este caso lo estamos aplicando sobre un elemento particular que tiene un identificador (su valor en key) para modificar un atributo en particular (value), directamente podríamos reemplazar todo un elemento que sea único en un archivo Web.config, como por ejemplo appSettings. En ese caso lo aplicaremos de la siguiente forma:

TransformacionConfig - AplicarReplaceElemento
xdt:Replace sobre todo el elemento

Podemos apreciar las siguientes diferencias con respecto al uso anterior:

  1. El atributo Transform lo aplicamos directamente en el elemento superior, sin indicar como parámetro qué atributo reemplazar. Tampoco se aplica el atributo Locator, ya que no es necesario aplicar algún criterio de identificación.
  2. Los elementos interiores están de forma plana, es decir sin aplicar atributos de transformación.

El resultado será el siguiente, quitando todo lo del archivo base y dejando solo lo del archivo derivado:

TransformacionConfig - ResultadoReplaceElemento
Resultado de modificar todo un elemento

 

Insertar elementos

A continuación veremos el segundo caso donde queremos agregar nuevos elementos con respecto a los que tenemos en nuestro archivo Web.config base. Para ello haremos uso del valor Insert en el atributo Transform. En ese te ejemplo agregaremos una nueva clave al appSettings:

TransformacionConfig - AplicarInsert
xdt:Transform para insertar un elemento

Al aplicar este tipo de transformación no debemos aclara un valor en el atributo Locator, ya que este nuevo elemento se insertará en el último lugar del elemento padre que lo contenga. Esto lo podemos ver en el resultado de este caso:

TransformacionConfig - ResultadoInsert
Resultado de agregar un elemento

 

Eliminar elementos

La última transformación que veremos en este post es para eliminar determinados elementos del Web.config base en los derivados. El uso es casi idéntico al planteado para la modificación, ya que debemos indicar con el atributo Locator en caso de que haya que realizar una búsqueda por valor de atributo, o sin usarlo en caso de que el atributo sea de tipo “único“. La diferencia estará en aplicamos el valor Remove para el atributo Transform, sin necesidad de parámetros:

TransformacionConfig - AplicarRemove
xdt:Transform para eliminar un elemento

Esto nos dará el siguiente resultado final, quitándose el elemento en cuestión:

TransformacionConfig - ResultadoRemove
Resultado de quitar un elemento

 

Estas son las transformaciones más comunes que generalmente aplicaremos en nuestros proyectos ASP.NET MVC. Les recomiendo la lectura de la documentación oficial, donde podrán encontrar algunas transformaciones más particulares de las aquí vistas.

Como pudimos ver, las transformaciones nos ofrecen una herramienta potente para poder tener ordenados los cambios que tienen los archivos de configuración en cada ambiente, de forma prolija, ordenada y teniendo constancia de que cambios se aplican en cada caso.

Espero que les sea útil, gracias por leer!!

Anuncios

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s