Integración Continua – Parte 2

Anteriormente vimos como podemos utilizar las transformaciones XML para manejar diferentes configuraciones en nuestras aplicaciones. Pero existe un problema con estas transformaciones: solo se realizan cuando publicamos o creamos un paquete de despliegue.

Esto impide los siguientes escenarios:

  • Aprovechar las configuraciones al momento de probar nuestra aplicación desde el mismo VS utilizando F5.
  • Utilizas las configuraciones desde diferentes proyectos para realizar pruebas de integración en diferentes ambientes utilizando alguna herramienta de testing.

Por suerte existe la capacidad de poder utilizar las transformaciones de manera independiente a una publicación, esto es posible gracias al task “TransformXML” de MsBuild.

    <TransformXml Source="{Source File}" 
                 
Transform="{Transform File}"
 
                 
Destination="{Destination File}"
/>

El inconveniente con este task es que el “source file” y el “destination file” no pueden ser el mismo archivo Web.config. Esta dificultad la podemos solucionar si organizamos nuestros archivos de una manera diferente.

Para esto copiamos el archivo Web.config y a este nuevo archivo le cambiamos de nombre a Web.Template.config.

image

Editamos nuestro archivo de proyecto.image

Y modificamos la sección donde se encuentran nuestros archivos config a lo siguiente.

  <ItemGroup>
    <
None Include="Web.Template.config"
/>
    <
Content Include="Web.config"
>
      <
DependentUpon>Web.Template.config</DependentUpon
>
    </
Content
>
    <
None Include="Web.Development.config"
>
      <
DependentUpon>Web.Template.config</DependentUpon
>
    </
None
>
    <
None Include="Web.ContinuousIntegration.config"
>
      <
DependentUpon>Web.Template.config</DependentUpon
>
    </
None
>
    <
None Include="Web.Production.config"
>
      <
DependentUpon>Web.Template.config</DependentUpon
>
    </
None
>
  </
ItemGroup
>

De esta manera le indicamos al VS que agrupe todos nuestros archivos config dentro del Web.Template.config. Asimismo utilizamos el nodo Content únicamente en el Web.config para que todos los demás archivos se borren al momento de realizar una publicación.

Para lograr que la transformación se realice siempre e inmediatamente después de la compilación, descomentamos el target “AfterBuild” e incluimos dentro el task “TransformXML”.

  <Target Name="AfterBuild">
    <
TransformXml Source="Web.Template.config"
 
                 
Transform="Web.$(Configuration).config"
 
                 
Destination="Web.config"
/>
  </
Target
>

Con esto el VS siempre que compile realizará una transformación utilizando el Web,Template.config como origen, utilizará el archivo de transformación correspondiente de acuerdo a nuestra configuración y dará como resultado un archivo Web.config.

Ahora que nuestra transformación se ejecuta al momento de compilar tenemos que evitarla al momento de publicar.

  <PropertyGroup>
    <
TransformWebConfigEnabled>False</TransformWebConfigEnabled
>
  </
PropertyGroup
>

Para finalizar y poder utilizar el task “TransformXml” lo importamos desde la instalación del VS.

  <UsingTask TaskName="TransformXml" 
            
AssemblyFile="$(MSBuildExtensionsPath)\Microsoft\VisualStudio\v10.0\Web\Microsoft.Web.Publishing.Tasks.dll"
/>

Grabamos y cargamos nuevamente nuestro proyecto.

image

Para probar la transformación simplemente cambiamos de configuración.

image

Compilamos y al finalizar veremos que el contenido del Web.config ha sido el resultado de una transformación.

image

Resumen

Las transformaciones facilitan el manejo de múltiples configuraciones, pero existen algunos escenarios en los cuales necesitamos que estas no solo se realicen al momento de publicar. Utilizando los pasos anteriores podemos aprovechar las transformaciones también al momento de compilar y sin afectar la publicación.

Lo que se viene

En los siguientes post veremos como aprovechar estas transformaciones para realizar tareas más complejas utilizando MsBuild.

Saludos
Angel Núñez Salazar