2009-01-05 11 views
8

Tengo un servicio web que necesita diferentes configuraciones para diferentes entornos (depuración, prueba, prod). ¿Cuál es la forma más fácil de configurar archivos de configuración separados para estos diferentes entornos? Todo lo que encuentro en la web me dice cómo usar Configuration Manager para recuperar configuraciones, pero no cómo encontrar configuraciones particulares basadas en la configuración de compilación actual.¿Cómo se configuran los archivos de configuración específicos de la configuración de la solución?

Respuesta

4

Creo que tener varios archivos de configuración para cada entorno funciona bien. es decir:

  • config \ local.endpoints.xml
  • config \ dev.endpoints.xml
  • config \ test.endpoints.xml
  • config \ staging.endpoints.xml
  • config \ prod.endpoints.xml

entonces me enlace a una versión de "maestro" de este con el construido en el atributo configSource dentro del web.config o app.config como

<appSettings configSource="config\endpoints.xml"/> 

Luego utilizaría el proceso de compilación o el proceso de implementación para copiar la configuración correcta del entorno hasta el nombre que espera el web.config.

Cada entorno está claramente etiquetado y controlado, sin la necesidad de marcadores de posición desordenados.

+0

Una vez que obtuve la línea de copia posterior a la compilación, esto funcionó muy bien. No lo he probado implementado, pero en depuración local funciona. Estoy un poco decepcionado de que Visual Studio ya no lo haga de una manera más fácil. – James

+0

Definitivamente cierto ... También intento dar un paso más y configurar lo más posible en código solo, tratando de lograr una aplicación de "autoconsciente" de entorno basada en cosas tales como IPAddress o el nombre de la máquina. Pero esa es otra historia por completo. – Xian

0

Utilizamos algunos métodos diferentes.

Environment.MachineName.config (para usuarios)

 System.Configuration.ExeConfigurationFileMap fileMap = new System.Configuration.ExeConfigurationFileMap(); 

     if (System.IO.File.Exists(String.Format("./{0}.config", Environment.MachineName))) 
      fileMap.ExeConfigFilename = String.Format(@"./{0}.config", Environment.MachineName); 
     else 
      fileMap.ExeConfigFilename = "live.config"; 

     System.Configuration.Configuration config = System.Configuration.ConfigurationManager.OpenMappedExeConfiguration(fileMap, System.Configuration.ConfigurationUserLevel.None); 

#IF DEBUG Debug.config

#IF TEST test.config

#IF PROD prod.config

  System.Configuration.ExeConfigurationFileMap fileMap = new System.Configuration.ExeConfigurationFileMap(); 

#if (DEBUG) 
      fileMap.ExeConfigFilename = "./debug.config"; 
#elif (TEST) 
      fileMap.ExeConfigFilename = "./test.config"; 
#else 
      fileMap.ExeConfigFilename = "./production.config"; 
#endif 

      System.Configuration.Configuration config = System.Configuration.ConfigurationManager.OpenMappedExeConfiguration(fileMap, System.Configuration.ConfigurationUserLevel.None); 

Aunque puede ser tedioso.

+0

va a agregar muestras de código, lo siento –

1

En la próxima versión de Visual Studio, esto mismo ha sido anunciado como una nueva característica. Quizás puedas hacerlo en un script de precompilación; reemplazando el archivo de configuración basado en la variable env de configurationname.

+0

[cita requerida]: P - informativo, pero ¿puede editar un enlace allí y mencionar qué versión sería? – annakata

+0

Es algo que llaman transformaciones de configuración, que es parte de la nueva MSDeploy. No estoy seguro de si es solo web. Se dio a conocer en PDC como parte de los futuros web. Se menciona aquí: http://blogs.msdn.com/webdevtools/archive/2008/12/30/vs-2010-for-web-developer-previews.aspx –

2

Una forma sería mantener 3 archivos de configuración diferentes y elegirlos a través de MSBuild durante la implementación.

<Choose> 
     <When Condition="$(BuildEnvironment) == 'debug'"> 
      <PropertyGroup> 
       <ConfigFile>debug.config</ConfigFile> 
      </PropertyGroup> 
     </When> 
     <When Condition="$(BuildEnvironment) == 'test'"> 
      <PropertyGroup> 
       <ConfigFile>test.config</ConfigFile> 
      </PropertyGroup> 
     </When> 
     <When Condition="$(BuildEnvironment) == 'prod'"> 
      <PropertyGroup> 
       <ConfigFile>prod.config</ConfigFile> 
      </PropertyGroup> 
     </When> 
    </Choose> 

Al utilizar una tarea de MSBuild, puede cambiar el nombre y enviar el archivo de configuración específico a la ubicación correcta.

Todavía algo engorroso, esto tiene la ventaja añadida de avanzar hacia un one step build.

0

Utilice directivas precompiladas. Código de muestra:

 String configFile = String.Empty; 
#if Debug 
     configFile = @"debug.config"; 
#elif Test 
     configFile = @"test.config"; 
#elif Prod 
     configFile = @"prod.config"; 
#endif 
     Load(configFile); 

Donde Cargar método cargó el archivo de configuración.

+0

necesita un espacio antes del #if para que funcione bien aquí, de lo contrario se pliega. –

1

Otra opción más: cambie a la configuración de la aplicación en una base de datos. Guardo los valores de tipo en una base de datos, de modo que la administración de estas configuraciones sea más centralizada. Entonces mi archivo de configuración tiene una cadena de conexión dedicada solo para la configuración, y tiene solo dos claves: un valor de ID de aplicación único y la versión de configuración (es decir, "dev", "prueba", etc.). Luego, simplemente despliegue el archivo de configuración correcto en el entorno correcto.

Eso puede no ser exactamente lo que estás buscando; es una alternativa para facilitar la administración de sus datos de configuración.

1

El problema que tengo con la respuesta de Xian es que si agrega una nueva configuración/punto final tiene que recordar hacerlo a través de varios archivos. Si olvida hacerlo, solo se dará cuenta cuando se despliegue en el entorno afectado (no es bueno).

En su lugar, podría tener una configuración maestra y usar regex/xmlpoke (nant)/[su-favorito-manipulador de texto] para administrar el archivo en el momento de la compilación/implementación para insertar los valores correctos para cada entorno, manteniendo la configuración para todos los entornos en otro archivo (pero crucialmente todos juntos).

Luego solo tiene que mantener un archivo de configuración y un archivo de configuración del entorno: creo que esto hace que el mantenimiento sea más fácil y claro a largo plazo.

Cuestiones relacionadas