Cómo seleccionar diferentes app.config para varias configuraciones de comstackción

Tengo un proyecto tipo dll que contiene las pruebas de integración MSTest. En mi máquina, las pruebas pasan, y quiero que ocurra lo mismo en un servidor de CI (uso TeamCity). Pero las pruebas fallan, porque necesito ajustar algunas configuraciones en app.config. Es por eso que estaba pensando en tener un segundo archivo app.config por separado que contendrá la configuración para el servidor CI.

Entonces me gustaría tener

 / Sln
  / Proj
   app.config (creo que esto es requerido por VS)
   app.Release.config (Este es un archivo independiente de configuración independiente)

Por lo tanto, si selecciono la configuración de liberación en la configuración de comstackción en CI, me gustaría utilizar el archivo app.Release.config en lugar de app.config

Problema
Esto no parece ser sencillo para proyectos de tipo simple .dll. Para proyectos web, puedo hacer transformaciones de configuración web. Encontré un hack sobre cómo hacer estas transformaciones para un proyecto tipo dll, pero no soy un gran fanático de los hacks.

Pregunta
¿Cuál es un enfoque estándar para ajustar archivos app.config dependiendo de la configuración de comstackción para proyectos .NET (como Debug, Release, …)?

Use el complemento SlowCheetah . Para obtener más opciones y detalles sobre cómo usar SlowCheetah sigue leyendo.

Como ya habrás notado, no existe una manera predeterminada y fácil de usar diferentes archivos de configuración para un proyecto de tipo Biblioteca (.dll) . La razón es que el pensamiento actual es: “¡No es necesario”! Los desarrolladores de Framework reconocen que necesita configuración para el archivo ejecutable: ya sea una consola, escritorio, web, aplicación móvil u otra cosa. Si comienzas a proporcionar configuración para un dll , puedes terminar con algo que puedo llamar un infierno de la configuración . Es posible que ya no comprenda (fácilmente) por qué esta y esas variables tienen esos valores extraños que aparecen aparentemente de la nada.

“Espera”, – puedes decir, “¡pero necesito esto para mi integración / prueba de unidad, y es una biblioteca!”. Y eso es cierto, y esto es lo que puedes hacer (elegir solo uno, no mezclar):

1. SlowCheetah – transforma el archivo de configuración actual

Puede instalar SlowCheetah , un complemento de Visual Studio que hace todo el análisis de bajo nivel de XML (o transformación) por usted. La forma en que funciona, brevemente:

  • Instale SlowCheetah y reinicie Visual Studio (Visual Studio> Herramientas> Extensiones y actualizaciones …> En línea> Galería de Visual Studio> busque “Slow Cheetah”)
  • Defina las configuraciones de su solución ( Debug and Release están ahí por defecto), puede agregar más (haga clic con el botón secundario en la solución en Solution Explorer > Configuration Manager … > Configuración de la solución activa > Nuevo …
  • Agregue un archivo de configuración si es necesario
  • Haga clic derecho en el archivo de configuración> Agregar transformación
    • Esto creará archivos de Transformación, uno por su configuración
    • Los archivos de transformación funcionan como inyectores / mutadores, encuentran el código XML necesario en el archivo de configuración original e inyectan nuevas líneas o modifican el valor necesario, sea lo que sea que le diga que haga.

2. Fiddle con el archivo .proj – copia-cambia el nombre de un archivo de configuración completamente nuevo

Originalmente tomado de aquí . Es una tarea personalizada de MSBuild que puede incrustar en el archivo .proj de Visual Studio. Copie y pegue el siguiente código en el archivo de proyecto

    

Ahora crea una carpeta en el proyecto llamada Config y agrega nuevos archivos allí: App.Debug.config , App.Release.config , y así sucesivamente. Ahora, según su configuración, Visual Studio seleccionará el archivo de configuración de una carpeta Config y lo copiará y lo cambiará al directorio de salida. Por lo tanto, si tiene el proyecto PatternPA.Test.Integration y una configuración de Debug seleccionada, en la carpeta de salida después de la comstackción encontrará un archivo PatternPA.Test.Integration.dll.config que se copió de Config\App.Debug.config y cambió de nombre. después.

Estas son algunas notas que puedes dejar en los archivos de configuración

      

En Visual Studio puedes tener algo como esto

Estructura del proyecto

3. Usa archivos de scripting fuera de Visual Studio

Cada herramienta de comstackción (como NAnt , MSBuild ) proporcionará capacidades para transformar archivos de configuración según la configuración. Esto es útil si construye su solución en una máquina de construcción, donde necesita tener más control sobre qué y cómo prepara el producto para su lanzamiento.

Por ejemplo, puede usar la tarea de dll de publicación web para transformar cualquier archivo de configuración

    path to app.config  path to app.$(Configuration).config  path to output project.dll.config     

Puedes probar el siguiente enfoque:

  1. Haga clic derecho en el proyecto en el Explorador de soluciones y seleccione Descargar proyecto .
  2. El proyecto será descargado. Haga clic derecho en el proyecto de nuevo y seleccione Editar .csproj .
  3. Ahora puede editar el archivo del proyecto dentro de Visual Studio.
  4. Ubique el lugar en el archivo * .csproj donde se incluye el archivo de configuración de la aplicación. Se verá así:
     
         
     
  1. Reemplace esta línea con la siguiente:
     
         
     

     
         
     

No he probado este enfoque para los archivos app.config , pero funcionó bien con otros elementos de proyectos de Visual Studio. Puede personalizar el proceso de comstackción de casi cualquier forma que desee. De todos modos, hágamelo saber el resultado.

Deberías considerar ConfigGen . Fue desarrollado para este propósito. Produce un archivo de configuración para cada máquina de implementación, basado en un archivo de plantilla y un archivo de configuración. Sé que esto no responde su pregunta específicamente, pero bien podría responder a su problema.

Entonces, en lugar de Depurar, Liberar, etc., puede tener Prueba, UAT, Producción, etc. También puede tener configuraciones diferentes para cada máquina desarrolladora, de modo que pueda generar una configuración específica para su máquina de desarrollo y cambiarla sin afectar la implementación de otra persona. .

Un ejemplo de uso podría ser …

     

Si coloca esto en su archivo .csproj, y tiene los siguientes archivos …

 $(ProjectDir)App.Config.Settings.xls MachineName ConfigFilePath SQLServer default App.config DEVSQL005 Test App.config TESTSQL005 UAT App.config UATSQL005 Production App.config PRODSQL005 YourLocalMachine App.config ./SQLEXPRESS $(ProjectDir)App.config.template.xml       

… entonces este será el resultado …

Desde el primer comando, un archivo de configuración generado para cada entorno especificado en el archivo xls, ubicado en el directorio de salida $ (SolutionDir) ConfigGen

 .../solutiondir/ConfigGen/Production/App.config       

Desde el segundo comando, el App.config local utilizado en su máquina dev se reemplazará con la configuración generada especificada por el conmutador local (-l) y el conmutador de nombre de archivo (-n).

Usando el mismo enfoque que Romeo, lo adapté a Visual Studio 2010:

    

Aquí debe mantener ambos archivos App.config en diferentes directorios (appDebug y appRelease). ¡Lo probé y funciona bien!

Estoy usando la herramienta XmlPreprocess para la manipulación de archivos de configuración. Está utilizando un archivo de mapeo para múltiples entornos (o múltiples objectives de comstackción en su caso). Puede editar el archivo de mapeo por Excel. Es muy fácil de usar.

SlowCheetah y FastKoala de la Galería de VisualStudio parecen ser muy buenas herramientas que ayudan con este problema.

Sin embargo, si desea evitar complementos o utilizar los principios que implementan más extensamente a lo largo de sus procesos de comstackción / integración, agregar esto a sus archivos msbuild * proj es una solución abreviada.

Nota: esto es más o menos una repetición del número 2 de la respuesta de @ oleksii.

Esto funciona para proyectos .exe y .dll:

     

Esto funciona para proyectos web:

     

Tenga en cuenta que este paso ocurre incluso antes de que comience la construcción propiamente dicha. La transformación del archivo de configuración ocurre en la carpeta del proyecto. De modo que el web.config transformado está disponible cuando está depurando (un inconveniente de SlowCheetah).

Recuerde que si crea la carpeta App_Config (o lo que usted elija para llamarla), los diversos archivos de configuración intermedios deben tener una Acción de comstackción = Ninguno, y Copiar en el directorio de salida = No copiar.

Esto combina ambas opciones en un bloque. El apropiado se ejecuta en base a las condiciones. La tarea TransformXml se define primero:

       

Vea si el motor de transformación XDT (web.config) puede ayudarlo. Actualmente solo es compatible de forma nativa para proyectos web, pero técnicamente no hay nada que le impida usarlo en otros tipos de aplicaciones. Hay muchas guías sobre cómo usar XDT editando manualmente los archivos del proyecto, pero encontré un complemento que funciona muy bien: https://visualstudiogallery.msdn.microsoft.com/579d3a78-3bdd-497c-bc21-aa6e6abbc859

El complemento solo está ayudando a configurar la configuración, no es necesario comstackrla y la solución se puede construir en otras máquinas o en un servidor de comstackción sin necesidad de utilizar el plugin ni ninguna otra herramienta.

He resuelto este tema con la solución que he encontrado aquí: http://www.blackwasp.co.uk/SwitchConfig.aspx

En resumen, lo que dicen es: “al agregar un evento de creación posterior. […] Necesitamos agregar lo siguiente:

 if "Debug"=="$(ConfigurationName)" goto :nocopy del "$(TargetPath).config" copy "$(ProjectDir)\Release.config" "$(TargetPath).config" :nocopy 

Después de investigar un poco sobre la administración de las configuraciones para el desarrollo y las comstackciones, etc., decidí lanzar el mío, lo he hecho disponible en bitbucket en: https://bitbucket.org/brightertools/contemplate/wiki/Home

Esta configuración múltiple de archivos para múltiples entornos, es una herramienta básica de reemplazo de entrada de configuración que funcionará con cualquier formato de archivo basado en texto.

Espero que esto ayude.

He oído cosas buenas sobre SlowCheetah, pero no pude hacer que funcione. Hice lo siguiente: agregué una etiqueta am a cada uno para una configuración específica.

Ex:

  bin\UAT\ AnyCPU pdbonly true TRACE prompt 4 App.UAT.config