¿Cómo lidiar con los archivos de configuración en el control de código fuente?

Digamos que usted tiene una típica web de la aplicación y con un archivo de configuración.lo que sea. Cada desarrollador que trabaja en el proyecto tendrá una versión para su dev cajas, habrá un dev, prod y la etapa de versiones. ¿Cómo lidiar con este en control de código fuente? No se busque en este archivo, compruebe con diferentes nombres o hacer algo de fantasía en total?

19 Kommentare

  1. 64

    Lo que he hecho en el pasado es tener un fichero de configuración por defecto que se comprueba en el control de código fuente. Luego, cada desarrollador tiene su propia reemplazar archivo de configuración que se excluye de control de código fuente. La primera aplicación que se carga el valor predeterminado y, a continuación, si el archivo override está presente, cargas y utiliza la configuración de la invalidación en la preferencia para el archivo predeterminado.

    En general, menor es el archivo override la mejor, pero siempre pueden contener más información de la configuración para un desarrollador con una muy no-estándar de medio ambiente.

  2. 21

    Configuración es código, y usted debería versión. Basamos nuestros archivos de configuración de nombres de usuario; en tanto UNIX/Mac y Windows, puede acceder a la conexión del usuario, nombre, siempre y cuando éstos sean únicos en el proyecto, están bien. Usted puede incluso reemplazar este en el medio ambiente, pero debe de control de versiones de todo.

    Esto también permite que usted examine demás configuraciones, que pueden ayudar a diagnosticar construir y plataforma de problemas.

    • +1 totalmente destacando que la configuración debe todavía ser versionados
    • Y si el nombre de usuario no es confiable, por cualquier razón, entonces usted puede tener un archivo único con una sola línea que da el nombre de reemplazar el archivo config. De esta manera, no es es poco (como en unos 10 caracteres o menos) que no son de la versión controlada. Y el archivo LÉAME que se podría explicar que usted necesita para hacer de ese archivo.
    • Siempre pienso que las configuraciones deben mantenerse separadas de código. He trabajado en los lugares que así lo requieran muchas configuraciones para una repo que Git sólo queda abrumado con archivos de configuración. No digo que configs no debería ser versionados, a la que pertenecen en otros lugares como un artefacto manager. Config no es código, son ajustes de código.
  3. 19

    No la versión de ese archivo. Versión de una plantilla o algo.

    • Yo uso este enfoque, sólo tengo una principal.php.tmpl y cuando puedo obtener una nueva copia acaba de copiar principal,php. Puedo añadir el main.php archivo a la lista de ignorados para evitar cometer por accidente.
  4. 9

    Mi equipo mantiene separadas las versiones de los archivos de configuración para cada entorno (de la web.config.dev, web.config.la prueba, en la web.config.prod). Nuestra implementación de secuencias de comandos de copia de la versión correcta, cambiando el nombre a la web.config. De esta manera, tenemos pleno control de versiones de los archivos de configuración para cada entorno, puede realizar fácilmente un diff, etc.

    • no tiene en cuenta la diferente env configuraciones pesar de derecho?
  5. 6

    Actualmente tengo la «plantilla» config archivo con una extensión, por ejemplo:

    web.config.rename
    

    Sin embargo, puedo ver un problema con este método si los cambios críticos han cambiado.

  6. 5

    +1 en la plantilla de enfoque.

    Pero esta cuestión ya tiene la etiqueta de Git, distribuido alternativa
    viene a la mente, en que las personalizaciones se mantiene en una evaluación privada
    rama:

    A---B---C---D---           <- mainline (public)
         \       \
          B'------D'---        <- testing (private)
    

    En este esquema, la línea principal contiene un genérico, «plantilla» config
    archivo que requiere la mínima cantidad de ajustes para ser funcional.

    Ahora, los desarrolladores y probadores pueden modificar el archivo de configuración para su corazón
    contenido, y sólo cometen estos cambios localmente en uno privado
    rama «testing» (por ejemplo, B’ = B + personalizaciones). Cada vez que la línea principal
    avances, que sin esfuerzo en combinar en la prueba, que se traduce en
    mezcla comete tales como D’ (= D + fusionado versión de B personalizaciones).

    Este esquema realmente brilla cuando la «plantilla» archivo de configuración se actualiza:
    los cambios de ambos lados se combinan, y es muy probable que
    el resultado en los conflictos (o a prueba de fallos) si son incompatibles!

    • Pero cuando los desarrolladores, probadores de inserción en la línea principal, sus cambios en el archivo de plantilla será empujado en así. No?
    • A menos que haya una solución a Nick comentario, esto no va a funcionar por lo que veo. O tal vez explique qué modelo de flujo estás usando que podría resolver el problema.
    • Estoy de acuerdo con la plantilla de enfoque con los ajustes necesarios al horno en el momento de la compilación. Sin embargo, en la ramificación de tema… ¿y si había varias plantillas (dev, prueba, etc.) y los desarrolladores simplemente omitir los cambios de su cometa. No es infalible pero podría trabajar con la cooperación.
  7. 5

    La solución que uso es tener sólo el único archivo de configuración (web.config/app.config), pero añadimos una sección especial para el archivo que contiene la configuración para todos los entornos.

    Hay un LOCAL, DEV, control de calidad, PRODUCCIÓN cada una de las secciones que contiene la configuración de claves relevantes para el medio ambiente en nuestro fichero de configuración(s).

    Lo que hacen que todo esto funcione es un ensamblado con nombre xxx.Medio ambiente que se hace referencia en todas nuestras aplicaciones (winforms y webforms) que indica la aplicación del entorno que se está operando.

    El xxx.Medio ambiente de la asamblea lee una sola línea de información de la de la máquina.config de la máquina que dice que está en la DEV, control de calidad, etc. Esta entrada está presente en todas nuestras estaciones de trabajo y servidores.

    Espero que esto ayude.

    • Esto funciona muy bien si sólo hay un par de diferencia entre el medio ambiente (es decir, cadenas de conexión)
    • y suponiendo que no hay 100s de los desarrolladores que ponen todas sus configuraciones personalizadas de allí (que todavía funciona, pero ser muy engorroso)
  8. 4

    He utilizado la plantilla antes, es decir, en la web.dev.configuración web.prod.config, etc, pero ahora prefiero el ‘archivo override’ técnica. La web.archivo de configuración contiene la mayoría de las opciones de configuración, pero un archivo externo que contiene el medio ambiente de los valores específicos tales como db conexiones. Buena explicación sobre Paul Wilson blog.

    Creo que esto reduce la cantidad a la duplicación entre los archivos de configuración que puede causar dolor cuando se añaden nuevos atributos de valores.

  9. 4

    Yo siempre he tenido todas las versiones de los archivos de configuración en el control de código fuente, en la misma carpeta que la web.el archivo config.

    Por ejemplo

    web.config
    web.qa.config
    web.staging.config
    web.production.config
    

    Yo prefiero esta convención de nomenclatura (en contraposición a la web.config.de producción o de producción.web.config) porque

    • Mantiene los archivos junto al ordenar por nombre de archivo
    • Mantiene los archivos juntos cuando se ordenan por la extensión de archivo
    • Si el archivo accidentalmente se inserta en la producción, usted no será capaz de ver el contenido a través de http, porque IIS evitará *.los archivos de configuración de los servicios

    El fichero de configuración por defecto debe ser configurado de tal manera que usted puede ejecutar la aplicación de forma local en su propia máquina.

    Lo que es más importante, estos archivos deben ser de casi el 100% idénticos en todos los aspectos, incluso el formato. Usted no debe usar pestañas en una versión de espacios y en otro para la sangría. Usted debe ser capaz de ejecutar una herramienta de comparación contra los archivos para ver exactamente lo que es diferente entre ellos. Yo prefiero usar WinMerge para la distinción de los archivos.

    Cuando su proceso de construcción crea los archivos binarios, no debería ser una tarea que sobrescribe la web.config con el archivo de configuración apropiada para el medio ambiente. Si los archivos están comprimidos de arriba, a continuación, la no relevante archivos deben ser eliminados de que construir.

  10. 3

    @Subvención a la derecha.

    Estoy en un equipo con cerca de 100 otros desarrolladores, y nuestros archivos de configuración no se comprueban en el control de código fuente. Tenemos versiones de los archivos en el repositorio que se tira con cada salida pero no cambio.

    Ha funcionado bastante bien para nosotros.

  11. 2

    Yo de control de versiones, pero nunca empujar a los otros servidores. Si el servidor de producción requiere un cambio, puedo hacer que el cambio directamente en el archivo de configuración.

    No puede ser bonito, pero funciona muy bien.

  12. 2

    El check-in, vestidos de vainilla versión de la app/web.config debe ser lo suficientemente genérico para trabajar en todos los equipos de desarrollador, y mantenerse al día con los nuevos cambios de configuración, etc. Si usted requiere un conjunto específico de opciones de configuración para dev/prueba/producción de la configuración, consulte en archivos separados, con los valores de configuración, como GateKiller dijo, con una especie de convención de nomenclatura, aunque yo suelo ir con la web».prod.config», ya que de no cambiar la extensión de archivo.

  13. 2

    Utilizamos una plantilla de archivo de configuración que está activado en la versión de control y, a continuación, un paso en nuestra generación automatizada para reemplazar entradas específicas en el archivo de plantilla con el medio ambiente de los ajustes específicos. El entorno específico de la configuración se almacena en un archivo XML independiente que también está bajo el control de versiones.

    Estamos usando MSBuild en nuestra generación automática, así que usar el XmlUpdate tarea de MSBuild De La Comunidad Tareas para actualizar los valores.

  14. 2

    Por un largo tiempo, he hecho exactamente lo que bcwood ha hecho. Yo guarde copias de la web.dev.configuración web.prueba.configuración web.prod.config, etc. bajo control de código fuente y, a continuación, mis crear/implementar el sistema cambia automáticamente a medida que se despliega en diversos entornos. Usted consigue una cierta cantidad de redundancia entre los archivos (sobre todo con todo el asp.net cosas), pero en general funciona muy bien. Usted también tiene que asegurarse de que todos en el equipo, recuerda actualizar todos los archivos cuando se realice un cambio.

    Por cierto, me gusta mantener «.config» en el extremo de la extensión, por lo que las asociaciones de archivo no se rompen.

    Local desarrollador de las versiones del archivo de configuración, siempre me a intentar mi mejor esfuerzo para animar a la gente a utilizar la misma configuración local tanto como sea posible, de modo que no hay necesidad de tener su propia versión. Esto no siempre funciona para todos, en cuyo caso la gente suele reemplazar sólo a nivel local como necesario e ir de allí. No es demasiado doloroso o nada.

  15. 1

    En nuestro proyecto hemos de configuración se almacenan en archivos con un prefijo y, a continuación, nuestro sistema de construcción tira en la configuración adecuada se basa en el actual sistema del nombre de host. Esto funciona bien para nosotros en un equipo relativamente pequeño, lo que nos permite aplicar los cambios de configuración a la gente de otros archivos si/cuando añadimos un nuevo elemento de configuración. Obviamente, esto definitivamente no escala a proyectos de código abierto con un número ilimitado de desarrolladores.

  16. 1

    Tenemos dos problemas aquí.

    • En primer lugar tenemos que controlar el archivo de configuración que se incluye con el software.

      Es todo, dos fácil para un desarrollador de verificación en un no deseado para cambiar a la maestra de su archivo de configuración, si están usando el mismo archivo en el entorno de desarrollo.

      Por otro lado, si usted tiene un archivo de configuración independiente que se incluye en el instalador, es muy fácil olvidarse de añadir un nuevo valor a la misma, o para dejar comentarios en salir de la sincronización con los comentarios en el desarrollo de la configuración de archivo.

    • Luego tenemos el problema de que los desarrolladores tienen que mantener allí copia del archivo de configuración para arriba-a-fecha como otros desarrolladores añadir nuevas opciones de configuración. Sin embargo, algunos ajustes de la base de datos como cadenas de conexión son diferentes para cada desarrollador.

    • Hay un 3er problema de la pregunta/respuestas no cubren. ¿Cómo se puede combinar en los cambios que el cliente tiene a su archivo de configuración al instalar una nueva versión de su software?

    Todavía tengo que ver un buen soluciones
    que funciona bien en todos los casos, sin embargo
    He visto algunos soluciones parciales
    (que pueden ser combinados en diferentes
    combinaciones como sea necesario) que reduce
    el problema de muchos.

    • En primer lugar, reducir el número de elementos de configuración que tiene en su archivo de configuración principal.

      Si usted no tiene una necesidad de dejar a sus clientes cambiar su asignación, uso Fluido de NHibernate (o no) para mover la configuración en el código.

      Igualmente para depency inyección de instalación.

    • Dividir el archivo de configuración cuando sea posible, por ejemplo, el uso de un archivo independiente para configurar lo que Log4Net registros.

    • No repetir los elementos entre un montón de archivos de configuración, por ejemplo, si tenemos 4 aplicaciones web que están instalados en la misma máquina, tiene un archivo de configuración de la web.archivo de configuración en cada uno de los puntos de aplicación para.

      (Utilice una ruta de acceso relativa por defecto, por lo que es raro tener que cambiar la web.archivo de configuración)

    • El proceso de desarrollo del archivo de configuración para obtener la configuración de envío de archivos.

      La que se podría hacer por tener valores por defecto en los comentarios Xml que luego se establezca en el archivo de configuración cuando una compilación se lleva a cabo. O tener secciones que se eliminan como parte del proceso de crear el instalador.

    • Lugar de sólo tener una base de datos de cadenas de conexión, tienen uno por los desarrolladores.

      E. g, busque primero «database_ianr» (donde ianr es mi nombre de usuario o nombre de la máquina) en el archivo de configuración en tiempo de ejecución, si no se encuentra, a continuación, busque «base de datos»

      Tienen un » nivel 2 «por ejemplo, oracle o -sqlserver» que sea más rápido para los desarrolladores para llegar a la base de datos de ambos sistemas.

      Por supuesto, también puede ser hecho por cualquier otro valor de configuración.

      A continuación, todos los valores que terminan en «_userName» puede ser rayado a cabo antes de enviar el archivo de configuración.

    Sin embargo, al final lo que es usted es un
    el «titular del archivo de configuración» que
    toma el responsable de la gestión de la
    archivo de configuración de la(s) como el anterior o
    de lo contrario. Él/Ella también debe hacer un
    diff en el cliente revestimientos
    archivo de configuración antes de cada
    el envío.

    Usted no puede eliminar la necesidad de una persona que cuida un poco este corto de problema.

  17. 1

    Creo que no hay una única solución que funcione para todos los casos ya que puede depender de la sensibilidad de los datos en los archivos de configuración, o el lenguaje de programación que se está utilizando, y tantos otros factores. Pero creo que es importante mantener los archivos de configuración para todos los entornos bajo control de código fuente, por lo que siempre se puede saber cuando fue cambiado y por quién, y lo que es más importante, ser capaz de recuperar si las cosas van mal. Y lo harán.

    Así que aquí está cómo lo hago. Esto es para nodejs proyectos por lo general, pero creo que funciona para otros frameworks y lenguajes también.

    Lo que yo hago es crear un configs directorio en la raíz del proyecto, y en virtud de que el directorio de mantener varios archivos para todos los entornos (y algunas veces archivos separados para cada desarrollador del medio ambiente así) que son de todos los cambios en el control de código fuente. Y no es el archivo real que utiliza el código denominado config en la raíz del proyecto. Este es el único archivo que no se realiza el seguimiento. Así que parece que esta

    root
    |
    |- config (not tracked)
    |
    |- configs/(all tracked)
        |- development
        |- staging
        |- live
        |- James
    

    Cuando alguien revisa el proyecto se copia el archivo de configuración que desea utilizar en el sin marcar config archivo y él es libre de editarlo como se desea, pero también es responsable para copiar estos cambios antes de que él se compromete a que el otro ambiente archivos según sea necesario.

    Y en los servidores, el sin marcar archivo puede ser simplemente una copia (o de referencia) de las marcas de archivo correspondiente a ese entorno. En JS puede tener simplemente 1 de la línea de exigir que el archivo.

    Este flujo puede ser un poco complicado al principio, pero que tiene grandes ventajas:
    1. Usted nunca tiene que preocuparse acerca de un archivo de configuración para ser eliminado o modificado en el servidor sin tener una copia de seguridad
    2. De la misma manera si un desarrollador tiene algunos personalizada configuración de su máquina y la máquina deja de funcionar por cualquier razón
    3. Antes de cualquier implementación puede diff los archivos de configuración para development y staging por ejemplo y ver si hay algo que falta o está rota.

    • actualizada la respuesta a aclarar
  18. 0

    Apenas guardamos el fichero de configuración de producción registrado. Es la responsabilidad del desarrollador para cambiar el archivo cuando se tire de ella fuera de la fuente segura de ensayo o de desarrollo. Esto ha quemado nosotros en el pasado, así que no lo recomendaría.

  19. 0

    Me enfrenté a ese mismo problema y he encontrado una solución para ello. Primero me agrega todos los archivos en el repositorio central (también el desarrollador queridos).

    Así que si un desarrollador recupera los archivos desde el repositorio del desarrollador de configuración también está ahí. Al cambiar realizadas a este archivo, Git no debe ser consciente de estos cambios. De esa manera los cambios no puede ser empujado/comprometidos con el repositorio, pero la estancia localmente.

    Lo resuelto mediante el comando git: update-index --assume-unchanged. He hecho un archivo bat que se ejecuta en la anterior a la compilación de los proyectos que se contiene un archivo cuyos cambios se deben ignorar por Git. Aquí está el código que he puesto en el archivo bat:

    IF NOT EXIST %2%\.git GOTO NOGIT
    set fileName=%1
    set fileName=%fileName:\=/%
    for /f "useback tokens=*" %%a in ('%fileName%') do set fileName=%%~a
    set "gitUpdate=git update-index --assume-unchanged"
    set parameter= "%gitUpdate% %fileName%"
    echo %parameter% as parameter for git
    "C:\Program Files (x86)\Git\bin\sh.exe" --login -i -c %parameter%
    echo Make FIleBehaveLikeUnchangedForGit Done.
    GOTO END
    :NOGIT
    echo no git here.
    echo %2%
    :END
    

    En mi anterior a la compilación me hizo una llamada al archivo bat, por ejemplo:

    call "$(ProjectDir)\..\..\MakeFileBehaveLikeUnchangedForGit.bat" "$(ProjectDir)Web.config.developer" "$(SolutionDir)"
    

    He encontrado en por LO que un archivo bat que copie el fichero de configuración correcto de la web.config/app.config. Yo también llamar a este archivo bat en la anterior a la compilación. El código de este archivo bat es:

    @echo off
    echo Comparing two files: %1 with %2
    if not exist %1 goto File1NotFound
    if not exist %2 goto File2NotFound
    fc %1 %2 
    if %ERRORLEVEL%==0 GOTO NoCopy
    echo Files are not the same.  Copying %1 over %2
    copy %1 %2 /y & goto END
    :NoCopy
    echo Files are the same.  Did nothing
    goto END
    :File1NotFound
    echo %1 not found.
    goto END
    :File2NotFound
    copy %1 %2 /y
    goto END
    :END
    echo Done.
    

    En mi anterior a la compilación me hizo una llamada al archivo bat, por ejemplo:

    call "$(ProjectDir)\..\..\copyifnewer.bat" "$(ProjectDir)web.config.$(ConfigurationName)" "$(ProjectDir)web.config
    

Kommentieren Sie den Artikel

Bitte geben Sie Ihren Kommentar ein!
Bitte geben Sie hier Ihren Namen ein

Pruebas en línea