He definido algunos valores en mi appsettings.json
para cosas como cadenas de conexión de bases de datos, ubicaciones de webapi y similares, que son diferentes para entornos de desarrollo, puesta en escena y en vivo.
¿Hay alguna manera de tener varios appsettings.json
archivos (como appsettings.live.json
, etc., etc.) y hacer que la aplicación asp.net simplemente 'sepa' cuál usar en función de la configuración de compilación que se está ejecutando?
c#
asp.net-core
appsettings
tweetypi
fuente
fuente
He añadido capturas de pantalla de un entorno de trabajo porque me ha costado varias horas de I + D.
Primero, agregue una clave a su
launch.json
archivo.Vea la captura de pantalla a continuación, que he agregado
Development
como mi entorno.Luego, en su proyecto, cree un nuevo
appsettings.{environment}.json
archivo que incluya el nombre del entorno.En la siguiente captura de pantalla, busque dos archivos diferentes con los nombres:
appsettings.Development.Json
appSetting.json
Y finalmente, configúrelo para su
StartUp
clase así: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) .AddEnvironmentVariables(); Configuration = builder.Build(); }
Y por último, puedes ejecutarlo desde la línea de comando así:
dotnet run --environment "Development"
donde
"Development"
esta el nombre de mi entorno.fuente
IWebHostEnvironment
en su lugar.Actualización para .NET Core 3.0+
Puede usar
CreateDefaultBuilder
que automáticamente construirá y pasará un objeto de configuración a su clase de inicio:public class Startup { public Startup(IConfiguration configuration) // automatically injected { Configuration = configuration; } public IConfiguration Configuration { get; } /* ... */ }
CreateDefaultBuilder
incluye automáticamente el archivo apropiado , así que agregue un archivo de configuración de aplicaciones separado para cada entorno:appsettings.Environment.json
Luego establezca la
ASPNETCORE_ENVIRONMENT
variable de entorno al ejecutar / depurarCómo configurar variables de entorno
Dependiendo de su IDE, hay un par de lugares donde los proyectos de dotnet tradicionalmente buscan variables de entorno:
Para Visual Studio, vaya a Proyecto> Propiedades> Depurar> Variables de entorno:
Para Visual Studio Code , edite
.vscode/launch.json
>env
:Usando Configuración de inicio , editar
Properties/launchSettings.json
>environmentVariables
:Que también se puede seleccionar de la barra de herramientas en Visual Studio
Con la CLI de dotnet , utilice la sintaxis adecuada para configurar las variables de entorno según su sistema operativo
¿Cómo
Host.CreateDefaultBuilder
funciona?Se agregó .NET Core 3.0
Host.CreateDefaultBuilder
en las extensiones de plataforma que proporcionarán una inicialización predeterminadaIConfiguration
que proporciona la configuración predeterminada para la aplicación en el siguiente orden:Lectura adicional - MS Docs
fuente
En ASP.NET Core, debería utilizar variables de entorno en lugar de compilar la configuración para appsettings.json adecuada
Haga clic derecho en su proyecto> Propiedades> Depurar> Variables de entorno
ASP.NET Core usará el archivo appsettings.json apropiado:
Ahora puede usar esa variable de entorno de esta manera:
public Startup(IHostingEnvironment env) { var builder = new ConfigurationBuilder() .SetBasePath(env.ContentRootPath) .AddJsonFile("appsettings.json", optional: true, reloadOnChange: true) .AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true) .AddEnvironmentVariables(); Configuration = builder.Build(); }
fuente
Puede hacer uso de variables de entorno y la
ConfigurationBuilder
clase en suStartup
constructor de esta manera:public Startup(IHostingEnvironment env) { var builder = new ConfigurationBuilder() .SetBasePath(env.ContentRootPath) .AddJsonFile("appsettings.json", optional: true, reloadOnChange: true) .AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true) .AddEnvironmentVariables(); this.configuration = builder.Build(); }
Luego, crea un
appsettings.xxx.json
archivo para cada entorno que necesita, con "xxx" como nombre del entorno. Tenga en cuenta que puede poner todos los valores de configuración global en su "normal"appsettings.json
archivo y solo poner las cosas específicas del entorno en estos nuevos archivos.Ahora solo necesita una variable de entorno llamada
ASPNETCORE_ENVIRONMENT
con algún valor de entorno específico ("en vivo", "puesta en escena", "producción", lo que sea). Puede especificar esta variable en la configuración de su proyecto para su entorno de desarrollo y, por supuesto, también debe establecerla en sus entornos de ensayo y producción. La forma en que lo haga depende del tipo de entorno que sea.ACTUALIZACIÓN: Me acabo de dar cuenta de que desea elegir el
appsettings.xxx.json
basado en su configuración de compilación actual . Esto no se puede lograr con mi solución propuesta y no sé si hay una manera de hacerlo. La forma de "variable de entorno", sin embargo, funciona y bien podría ser una buena alternativa a su enfoque.fuente
Solo una actualización para los usuarios de .NET core 2.0, puede especificar la configuración de la aplicación después de la llamada a
CreateDefaultBuilder
:public class Program { public static void Main(string[] args) { BuildWebHost(args).Run(); } public static IWebHost BuildWebHost(string[] args) => WebHost.CreateDefaultBuilder(args) .ConfigureAppConfiguration(ConfigConfiguration) .UseStartup<Startup>() .Build(); static void ConfigConfiguration(WebHostBuilderContext ctx, IConfigurationBuilder config) { config.SetBasePath(Directory.GetCurrentDirectory()) .AddJsonFile("config.json", optional: false, reloadOnChange: true) .AddJsonFile($"config.{ctx.HostingEnvironment.EnvironmentName}.json", optional: true, reloadOnChange: true); } }
fuente
ASPNETCORE_ENVIRONMENT
. El valor es lo que será reemplazadoctx.HostingEnvironment.EnvironmentName}
. Entonces, si establece ese valor en las propiedades en 'Producción', el proyecto buscará elconfig.Production.json
archivo en la carpeta raíz. Para obtener más información, consulte este enlaceError CS0266 Cannot implicitly convert type 'Microsoft.AspNetCore.Hosting.IWebHost' to 'Microsoft.AspNetCore.Hosting.IWebHostBuilder'. An explicit conversion exists (are you missing a cast?)
WebHost.CreateDefaultBuiler (...Crea varios archivos como:
appSettings.$(Configuration).json
appSettings.staging.json
appSettings.production.json
Cree un evento previo a la construcción en el proyecto que copie el archivo respectivo en
appSettings.json
:Usar unicamente
appSettings.json
en su Config Builder:var builder = new ConfigurationBuilder() .SetBasePath(env.ContentRootPath) .AddJsonFile("appsettings.json", optional: false, reloadOnChange: true) .AddEnvironmentVariables(); Configuration = builder.Build();
fuente
Se puede añadir el nombre de la configuración como la
ASPNETCORE_ENVIRONMENT
de lalaunchSettings.json
de la siguiente"iisSettings": { "windowsAuthentication": false, "anonymousAuthentication": true, "iisExpress": { "applicationUrl": "http://localhost:58446/", "sslPort": 0 } }, "profiles": { "IIS Express": { "commandName": "IISExpress", "environmentVariables": { ASPNETCORE_ENVIRONMENT": "$(Configuration)" } } }
fuente
Esta es la versión que me funciona cuando uso una aplicación de consola sin una página web:
var builder = new ConfigurationBuilder() .SetBasePath(Directory.GetCurrentDirectory()) .AddJsonFile("appsettings.json", optional: true, reloadOnChange: true) .AddJsonFile($"appsettings.{Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT")}.json", optional: true); IConfigurationRoot configuration = builder.Build(); AppSettings appSettings = new AppSettings(); configuration.GetSection("AppSettings").Bind(appSettings);
fuente
El archivo .vscode / launch.json solo lo usa Visual Studio, así como el archivo /Properties/launchSettings.json. No utilice estos archivos en producción.
El archivo launchSettings.json:
contiene la configuración del perfil.
Para usar un archivo 'appSettings.QA.json', por ejemplo. Puede utilizar 'ASPNETCORE_ENVIRONMENT'. Siga los pasos a continuación.
fuente