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
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.
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.
va a agregar muestras de código, lo siento –
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.
[cita requerida]: P - informativo, pero ¿puede editar un enlace allí y mencionar qué versión sería? – annakata
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 –
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.
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.
necesita un espacio antes del #if para que funcione bien aquí, de lo contrario se pliega. –
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.
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.
- 1. ¿Cómo configuro Mercurial para no confirmar archivos de configuración específicos?
- 2. Cómo usar los archivos de configuración parcial
- 3. Caracteres de índice específicos de configuración regional
- 4. ¿Cómo se automatiza la configuración de Eclipse?
- 5. ¿Cómo puedo rastrear los archivos de configuración específicos del sistema en un repositorio/proyecto?
- 6. ¿Se admiten variables en los archivos de configuración de logrotate?
- 7. ¿Los archivos de configuración Doxygen admiten variables?
- 8. ¿Cómo administro la configuración de la aplicación en ASP.NET?
- 9. Cómo versionar los archivos de configuración de control pragmáticamente?
- 10. Configuración de la aplicación
- 11. Configuración de la configuración regional de Java
- 12. ¿Cómo modificar archivos de configuración .NET durante la instalación?
- 13. Archivos de configuración de FitNesse
- 14. Eclipse: Configuración de la ejecución de la configuración para archivos HTML/Javascript
- 15. Cómo cargar múltiples archivos de configuración usando la configuración común de apache (java)
- 16. Cómo cambiar la configuración LAN (configuración de proxy) programáticamente
- 17. La configuración de "depuración | BNB" especificado no es válido solución
- 18. ¿Monodevelop admite archivos de configuración?
- 19. configuración de configuración de git para archivos de gran tamaño
- 20. IE10 - Configuración de modos específicos de navegador y documento
- 21. Cómo comentar en los archivos de configuración de Vim: ".vimrc"?
- 22. archivos de configuración en Silverlight
- 23. Uso de la configuración de la aplicación en los ensamblajes
- 24. ¿La configuración del archivo web.config anula la configuración de IIS?
- 25. ¿Cómo evito que 'Publicar web' sobrescriba los archivos de configuración?
- 26. Cómo usar los archivos de configuración web en Silverlight
- 27. ¿Cómo incluyo los archivos de configuración con Maven Appassembler?
- 28. Configuración de configuración faltante en el administrador de configuración
- 29. ¿Cómo pasar las credenciales en la configuración de configuración defaultProxy?
- 30. ¿Cómo verifico la configuración de la solución activa Visual Studio desarrollada en tiempo de ejecución?
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
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