He agregado archivos de configuración json adicionales a mi proyecto
appsettings.DEV.json appsettings.QA.json
y los cargó en la función de Startup
según el entorno:
public Startup(IHostingEnvironment env) { var builder = new ConfigurationBuilder() .SetBasePath(env.ContentRootPath) .AddJsonFile("appsettings.json", optional: false, reloadOnChange: true) .AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true, reloadOnChange: true); ...
Y entiendo cómo cambiar el entorno: modificar el valor de la variable de entorno ASPNETCORE_ENVIRONMENT
en las propiedades del proyecto. Sin embargo, no parece haber la posibilidad de especificar diferentes variables de entorno según la configuración, la lista desplegable está etiquetada como "N/A" y deshabilitada.
La única opción que veo es cambiar manualmente el valor de la variable de entorno, para cambiar qué configuración de aplicación se usa. Estoy seguro de que hay una manera de hacerlo automáticamente, o de lo contrario, ¿cómo usarías CI? (aparte de usar un script para cambiar la variable de entorno, tiene que haber una manera más fácil).
El objetivo aquí es configurar compilaciones automatizadas e integración continua para tres entornos: DEV, QA y PROD. DEV y QA están en la misma máquina , por lo que configurar la variable de entorno que especifica el entorno manualmente no es una opción.
Para cualquiera que desee establecer el nombre del entorno en función del tipo de compilación, existe el práctico .UseEnvironment(environmentName)
en WebHostBuilder
(que se encuentra en Program Main).
Siempre que los símbolos de compilación apropiados se establezcan en las configuraciones de compilación de su proyecto, puede hacer algo como esto para determinar el EnvironmentName:
public static void Main(string[] args) { string environmentName; #if DEBUG environmentName = "Development"; #elif STAGING environmentName = "Staging"; #elif RELEASE environmentName = "Production"; #endif var host = new WebHostBuilder() .UseKestrel() .UseEnvironment(environmentName) .UseContentRoot(Directory.GetCurrentDirectory()) .UseIISIntegration() .UseStartup<Startup>() .UseApplicationInsights() .Build(); host.Run(); }
Encontré una solución de la respuesta de Tseng, pero deseo describirla aquí para mayor claridad. La solución se encuentra en la respuesta a otra pregunta; sin embargo, la pregunta es bastante diferente (y también he ampliado la respuesta), por lo que no creo que esta pregunta deba marcarse como duplicada.
la respuesta esta aqui
La solución es configurar diferentes valores de variables de entorno en cada sitio IIS para la clave ASPNETCORE_ENVIRONMENT
Los pasos para hacerlo son:
Configuration Editor
.Configuration Editor
system.webServer/aspNetCore
(RC2 y RTM) o system.webServer/httpPlatform
(RC1) en el cuadro combinado Section
Applicationhost.config ...
en el cuadro combinado From
.enviromentVariables
y abra la ventana de edición. Alternativamente, puede modificar su archivo applicationHost.config
(normalmente ubicado en C:\Windows\System32\inetsrv\config\applicationHost.config
Y agregue la siguiente entrada debajo de la etiqueta raíz <Configuration>
, donde "my-iis-site" es el nombre de su sitio IIS.
<location path="my-iis-site"> <system.webServer> <aspNetCore> <environmentVariables> <environmentVariable name="ASPNETCORE_ENVIRONMENT" value="DEV" /> </environmentVariables> </aspNetCore> </system.webServer> </location>
Si usa el código predeterminado en Program.cs
, no necesita hacer nada más que crear los dos archivos en el proyecto.
El código predeterminado en Program.cs
se ve así:
public static IWebHost BuildWebHost(string[] args) => WebHost.CreateDefaultBuilder(args) .UseStartup<Startup>() .Build();
Esto es lo que realmente está haciendo:
public static IWebHostBuilder CreateDefaultBuilder(string[] args) { var builder = new WebHostBuilder(); ... builder.ConfigureAppConfiguration((hostingContext, config) => { var env = hostingContext.HostingEnvironment; config.AddJsonFile("appsettings.json", optional: true, reloadOnChange: true) .AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true, reloadOnChange: true); }); ... return builder; }
env.EnvironmentName
se establece en el valor de la variable de entorno ASPNETCORE_ENVIRONMENT
, por lo que todo lo que tiene que hacer es crear el appsettings.{ASPNETCORE_ENVIRONMENT}.json
y se fusionará automáticamente.
Nota adicional: para que los dos archivos se fusionen realmente, use esta sintaxis:
var appSettings = Configuration.GetSection("AppSettings").Get<AppSettings>();
no:
var appSettings = new AppSettings(); Configuration.Bind("AppSettings", appSettings); return appSettings;
Este último no devolverá los datos combinados.
Gracias a Shawn Wildermuth por esto .