Tenemos varios equipos de desarrolladores en diferentes oficinas, y necesitan diferentes valores para varios ajustes de configuración en los proyectos web.config
y app.config
.configuraciones específicas de la máquina web.config y app.config en git
Nos gusta mantener estos archivos de configuración controlados con un conjunto razonable de valores predeterminados, de modo que al verificar la rama troncal/maestra tiene algo que funciona sin necesidad de buscar archivos de configuración.
Históricamente hemos utilizado Subversion, y específicamente TortoiseSVN, y esto proporcionó una manera fácil de administrar cambios locales: simplemente agregamos estos archivos a la lista de cambios automática ignore-on-commit
de TortoiseSVN. Esto evita el registro accidental de estos archivos, ya que luego debe seleccionarlos específicamente para incluirlos en un check-in (y puede asegurarse de que está comprobando cambios significativos, no ruido de configuración local). La principal desventaja de este enfoque es que los archivos de configuración siempre se ven "modificados", por lo que no es posible saber de un vistazo si tiene algún cambio local.
Estamos buscando cambiar a Git, y estoy tratando de encontrar el mejor enfoque.
En primer lugar, lo que ya existe en otras respuestas StackOverflow:
Opción 1: Llegada archivos xxx.sample y .gitignore los archivos de configuración reales: Esto se recomienda, por ejemplo, en this answer. El problema principal que veo con esto es que los cambios en el archivo de configuración se olvidan fácilmente, en dos puntos diferentes: el committer puede perder fácilmente los cambios que necesitan agregar al archivo .sample
, y los consumidores (especialmente el servidor de integración continua) pueden fácilmente pierda los cambios que necesitan incorporar desde el archivo .sample
en su archivo de configuración local. Entonces, básicamente, esa no parece una muy buena solución.
Opción 2: Tener un facturado en el archivo xxx.defaults y un archivo de configuración xxx.local .gitignored que anula cualquier configuración que define: Este es ofrecido, fr ejemplo, here. El problema es que estamos trabajando con proveedores de configuración de .Net estándar. Realmente no quiero que implementemos un marco de carga de configuraciones completamente nuevo cuando Mirosoft ya ha hecho todo el trabajo. ¿Alguien sabe cómo obtener los archivos app.config y web.config para hacer referencia a los archivos de anulación local opcionales?
Opción 3: Tener los desarrolladores de mantener las ramas locales, y luego tenerlas siempre comprobar en cereza-picks o restablecen las ramas en maestro, a bypass/evitar siempre las confirmaciones no deseados en su rama local: Esto se ofrece como una posible flujo de trabajo here, y si bien aprecio la limpieza en términos de seguimiento de cambios (todo registrado), introduce una cantidad significativa de requiere de gastos generales en cada registro; es un gran dolor!
Opción 4: Tener archivos de configuración registramos, pero ellos han marcado con --assume-unchanged
: Esto se ofrece como una opción posible here; por lo que puedo decir, es muy similar en espíritu a la lista de cambios ignore-on-commit
en TortoiseSVN, excepto que no tiene visibilidad para estos archivos cambiados "ocultos" en un proceso de confirmación; TortoiseGit, por ejemplo, muestra el archivo con una superposición de iconos "modificada", pero en el cuadro de diálogo de confirmación el archivo no aparece en absoluto. Esto parece un poco aterrador, nuevamente es muy fácil olvidarse de verificar los cambios en.
Dadas estas opciones, que son todas las que he encontrado, realmente estoy esperando una manera de "incluir" opcionalmente un archivo de configuración local en/sobre un archivo app.config/web.config registrado y vaya con opción 2; ¿Alguien sabe de una manera de hacer esto u otras opciones que me estoy perdiendo? (Estoy un poco tentado de considerar un paso personalizado de precompilación Xml-fusión ...)
Debería haber mencionado antes, todavía estamos en VS2008, por lo que las Transformaciones de configuración no están disponibles.
ACTUALIZACIÓN: (suprimido, estaba mal llano)
ACTUALIZACIÓN 2: He eliminado mi actualización y la respuesta anterior, que era una estupidez/no funcionó. No me di cuenta de que después de una fusión "nuestra", la siguiente fusión en la otra dirección lleva las versiones "originales" de esos archivos (sobrescribe los cambios de la sucursal local); ver el historial de edición si estás interesado. Esta pregunta es tan abierta como siempre.
¿Qué enfoque acabas de tomar? Gracias. – Hewins
Terminamos creando una herramienta interna que no puedo compartir sin saltar demasiados aros para contar. Simplemente admite marcadores de posición en archivos de "plantilla", que convierte en archivos "finales". Las asignaciones de marcador de posición a valor se almacenan en un par de documentos Xml simples, un documento "predeterminado" se registró y un documento "local" no se registró (.gitignored). Los archivos de plantilla están registrados, pero todos los archivos de salida están ignorados. Se puede ejecutar en el modo "sobrescribir discrepancias" o en el modo "advertir sobre discrepancias", donde desea utilizar el archivo final (por ejemplo, web.config) para actualizar la plantilla correspondiente. – Tao