¿Alguien sabe de alguna buena herramienta/utilidades para administrar archivos Web.Config
entre diferentes entornos de compilación/despliegue?Administración de archivos complejos Web.Config entre entornos de implementación
Por ejemplo, tengo un proyecto WCF que, en desarrollo, no quiero habilitar SSL, pero sí quiero que esté habilitado en producción. Quiero diferentes configuraciones de registro, diferentes cadenas de conexión de DB, manejo de errores diferentes, diferentes rutas de archivos ... Incluso algunos enlaces de framework de Unity diferentes (wire up mocks para pruebas unitarias en lugar de los objetos reales para implementación).
Mantener las copias individuales del Web.Config
es un problema, porque agregar un nuevo servicio web significa editar varios archivos y mantenerlos sincronizados.
También he notado que si arruinas demasiado el Web.Config
a mano, Visual Studio se ahogará si tratas de usar el asistente "agregar elemento" para, digamos, agregar un nuevo servicio web para WCF, ya que tiene que modificar Web.Config para agregar el punto final, y nd no puede analizarlo más. Por lo tanto, debo tener cuidado de no invalidar el Web.Config existente.
También pensé en usar solo regex para hacer reemplazos y simplemente construir un nuevo Web.Config
en un comando previo a la compilación. Esa parece ser la mejor opción hasta ahora ...
¿Alguna otra idea? Parece que esto debería ser un problema muy común, ya que el Web.Config
probablemente nunca debería ser el mismo entre las implementaciones de desarrollo y producción.
Actualización:
decidí escribir una aplicación de consola rápida que se llevará a todos los archivos XML en un directorio determinado y fusionarlas en una sola, y sólo incluir ciertos archivos basado en el nombre.
Así que puedo hacer en un directorio:
WebConfig_All
<configuration>
<configSections>
...
</configSections>
<system.web>
...
</system.web>
</configuration>
connectionStrings_Debug
<configuration>
<connectionStrings>
<add name="connstr" connectionString="...dev..." />
</connectionStrings>
</configuration>
connectionStrings_Release
<configuration>
<connectionStrings>
<add name="connstr" connectionString="...prod..." />
</connectionStrings>
</configuration>
A continuación, ejecute mi herramienta de línea de comandos, y pasan en la configuración (depuración, liberación, a medida ...) y va a fusionar todos los archivos que terminan en _All" or
_ < configuración `>.
Así que ahora tengo el 80% de mi Web.Config en un solo archivo WebConfig_All
, y el 20% de cosas personalizadas en archivos separados por configuración de compilación. Luego puedo ejecutar mi herramienta de línea de comando como una tarea previa a la construcción en VisualStudio, o desde NAnt, o donde yo quiera ...
También hice mi lógica de combinación de XML suficientemente bueno para manejar cosas como:
<x>
<y a="1">
<z a="1"/>
</y>
</x>
fusión con
<x>
<y a="1">
<z a="2"/>
</y>
<y a="2"/>
</x>
resultados en:
<x>
<y a="1">
<z a="1"/>
<z a="2"/>
</y>
<y a="2"/>
</x>
Verse bien hasta ahora .. . :)
Seguimiento:
Este tema es un poco viejo ahora, así que quería señalar que VisualStudio 2010 tiene una función para hacer transformaciones web.config incorporada: http://msdn.microsoft.com/en-us/vstudio/Video/ff801895
Por supuesto, en el típico La moda de Microsoft de implementar solo cualquier función el 50% del camino, solo funciona para proyectos web que usan despliegue web. Hay un plugin para permitir transformaciones en otros proyectos, que se encuentra aquí: http://www.hanselman.com/blog/SlowCheetahWebconfigTransformationSyntaxNowGeneralizedForAnyXMLConfigurationFile.aspx
También es posible usar una herramienta como BuildMaster para gestionar archivos de configuración (junto con las formaciones, pruebas, scripts de base de datos, etc ...)
Me gusta el uso del atributo configSource. Quizás pueda incorporar eso de alguna manera. Sería bueno si visualstudio pudiera traducirlos automáticamente en el momento de la construcción y usar los marcos de las herramientas de ejecución ... para que pueda especificar "configSource = Config \ $ (ConfigurationName) \ My.Config" – CodingWithSpike
¡Esta es una GRAN solución! En donde estoy, los desarrolladores usan Visual Studio para el trabajo de desarrollo, luego tenemos una máquina de creación usando CruiseControl y NAnt que crea las diferentes versiones (prueba, etapa, producción, ...). Esto es perfecto para nosotros, porque podríamos simplemente crear una tarea NAnt para copiar los archivos de configuración apropiados en función de la versión que se está creando (o podría usar MSBuild o Visual Studio para hacer lo mismo si se adapta mejor a su entorno). –