Etiquetas

Por regla general, para el desarrollo de aplicaciones disponemos de varios entornos, el entorno del desarrollador, entorno de pruebas, entorno de preproducción y entorno de producción. El objetivo es llegar a este último con el mínimo de errores (o con ninguno).

Esta disponibilidad de entornos, nos lleva a que distintas configuraciones convivan en el tiempo siendo cada una de ellas para un sitio distinto. Esta problemática se identificó hace ya tiempo en las aplicaciones web, pero puede ser deseable tenerla implementada en aplicaciones de escritorio como son los Windows Forms.

Hoy nos centraremos en que las aplicaciones Windows reconozcan la configuración de multiconfig y sea capaz de sobrescribir el app.config de la aplicación después de la compilación.

Disponemos de dos opciones:

  • Tradicional: se crea un app.config con todal las claves y se comentan las que no sean del entorno. Para cada despliegue hay que ir comentando y descomentando del archivo de configuración según proceda.
  • Crear un multiconfig que permita el despliegue en varios entorno, esta opción no solo es más elegante, sino que nos permite la comodidad de desplegar automáticamente con las configuraciones correctas simplemente eligiendo el entorno. Para este tipo se siguen los siguientes pasos:
  1. Edición del archivo de proyecto: crearemos una PropertyGroup por cada entorno, para ello copiaremos de las que nos vienen por defecto (debug o reléase) según queramos que la compilación sea en de una manera o de otra.

<PropertyGroup Condition=” ‘$(Configuration)|$(Platform)’ == ‘Debug|AnyCPU’ “>

<PlatformTarget>AnyCPU</PlatformTarget>

<DebugSymbols>true</DebugSymbols>

<DebugType>full</DebugType>

<Optimize>false</Optimize>

<OutputPath>bin\Debug\</OutputPath>

<DefineConstants>DEBUG;TRACE</DefineConstants>

<ErrorReport>prompt</ErrorReport>

<WarningLevel>4</WarningLevel>

<Prefer32Bit>true</Prefer32Bit>

</PropertyGroup>

<PropertyGroup Condition=” ‘$(Configuration)|$(Platform)’ == ‘Preproduccion|AnyCPU’ “>

<PlatformTarget>AnyCPU</PlatformTarget>

<DebugSymbols>true</DebugSymbols>

<DebugType>full</DebugType>

<Optimize>false</Optimize>

<OutputPath>bin\Debug\</OutputPath>

<DefineConstants>DEBUG;TRACE</DefineConstants>

<ErrorReport>prompt</ErrorReport>

<WarningLevel>4</WarningLevel>

<Prefer32Bit>true</Prefer32Bit>

</PropertyGroup>

 

Donde como dato más destacable podemos decir que “Preproduccion” utiliza la plataforma AnyCPU y que además se compila en Debug.

2- Añadir ItemGroup al archivo de proyecto: Crearemos la lista de configuraciónes a realizar a través de un ItemGroup tal y como mostramos a continuación:

<ItemGroup>

<!–Para el diseñador–>

<None Include=”app.config” />

<None Include=”App.Debug.config”>

<SubType>Designer</SubType>

<DependentUpon>App.config</DependentUpon>

</None>

<None Include=”App.Test.config”>

<SubType>Designer</SubType>

<DependentUpon>App.config</DependentUpon>

</None>

<None Include=”App.Preproduccion.config”>

<SubType>Designer</SubType>

<DependentUpon>App.config</DependentUpon>

</None>

<None Include=”App.Produccion.config”>

<SubType>Designer</SubType>

<DependentUpon>App.config</DependentUpon>

</None>

<None Include=”App.Release.config”>

<SubType>Designer</SubType>

<DependentUpon>App.config</DependentUpon>

</None>

</ItemGroup>

 

En el ejemplo podemos ver que se define un archivo por entorno y el archivo sobre el que actúa, es decir el archivo al que complementa. Aquí todos los archvo s de configuración actúan sobre el archivo App.config.

3- Coomandos de compilación: Por ultimo hay que hacer que al compilar sobre escriba el archivo de configuración general, para ello utilizaremos los siguiente elementos, que se definen hacia el final del archivo de proyecto. Estos elementos son para poder recuperar las herramientas de compilación y sobreescritura del app.config general.

Configuración para C#.

<Import Project=”$(MSBuildToolsPath)\Microsoft.CSharp.targets” />

 

<Target Name=”AfterBuild”>

<PropertyGroup>

<TempFile>$([System.IO.Path]::GetTempFileName())</TempFile>

</PropertyGroup>

<Copy SourceFiles=”@(AppConfigWithTargetPath)” DestinationFiles=”$(TempFile)” />

Comando de postcompilación. Aquí definimos el archivo temporal que será la salida del resultado de la transformación del entorno de configuración.

<TransformXml Source=”$(TempFile)” Transform=”$(ProjectConfigTransformFileName)” Destination=”@(AppConfigWithTargetPath->’$(OutDir)%(TargetPath)’)” />

<Copy SourceFiles=”@(AppConfigWithTargetPath->’$(OutDir)%(TargetPath)’)” DestinationFiles=”App.config” />

Copia al archivo de configuración final.

</Target>

<Import Project=”$(MSBuildExtensionsPath)\Microsoft\VisualStudio\v10.0\Web\Microsoft.Web.Publishing.targets” />

Preprocesador de config, llama la atención que sea de la versión v10.0, pero realmente es así. No hay que intentar forzarla a nuestra versión actual de visual studio.

<PropertyGroup>

<ProjectConfigFileName>App.config</ProjectConfigFileName>

</PropertyGroup>

<Import Project=”$(MSBuildBinPath)\Microsoft.CSharp.targets” />

 

Como ya se ha comentado, esta configuración es típica de sitios web. Por lo que, por sí sola no es suficiente. Si ha llegado hasta aquí y sigue sin funcionar, hay que decirle al entorno como se compila cada uno de los proyectos.

4- Configuración del ConfigurationMananger: Desde el archivo de solución sacamos el ConfigurationMananger y asignamos la configuración a los proyectos. Si no aparece alguno hay que crearlo pero sin marcar la casilla de crear configuración, ya que esto lo hemos hecho en el primer paso al configurar el archivo de proyecto.

img2

img1

Con esto, cuando compilemos, nos dirá que ha sobreescrito el app.config y si queremos recargarlo (siempre y cuando esté abierto el app.config) y podremos ver como en cada despliegue se despliega con su configuración pertinente.

Un saludo y espero que sea de utilidad.

Anuncios