Eu defini alguns valores em meu appsettings.json
para coisas como strings de conexão de banco de dados, localizações de webapi e outros que são diferentes para ambientes de desenvolvimento, teste e ao vivo.
Existe uma maneira de ter vários appsettings.json
arquivos (como appsettings.live.json
etc, etc) e fazer com que o aplicativo asp.net apenas 'saiba' qual usar com base na configuração de compilação que está executando?
c#
asp.net-core
appsettings
remédios
fonte
fonte
Adicionei capturas de tela de um ambiente de trabalho, porque me custou várias horas de P&D.
Primeiro, adicione uma chave ao seu
launch.json
arquivo.Veja a imagem abaixo, eu adicionei
Development
como meu ambiente.Então, em seu projeto, crie um novo
appsettings.{environment}.json
arquivo que inclua o nome do ambiente.Na captura de tela a seguir, procure dois arquivos diferentes com os nomes:
appsettings.Development.Json
appSetting.json
E, finalmente, configure-o para sua
StartUp
classe assim: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(); }
E, por fim, você pode executá-lo a partir da linha de comando assim:
dotnet run --environment "Development"
onde
"Development"
está o nome do meu ambiente.fonte
IWebHostEnvironment
lugar.Atualização para .NET Core 3.0+
Você pode usar o
CreateDefaultBuilder
qual criará e passará automaticamente um objeto de configuração para sua classe de inicialização:public class Startup { public Startup(IConfiguration configuration) // automatically injected { Configuration = configuration; } public IConfiguration Configuration { get; } /* ... */ }
CreateDefaultBuilder
inclui automaticamente o arquivo apropriado, portanto, adicione um arquivo appsettings separado para cada ambiente:appsettings.Environment.json
Em seguida, defina a
ASPNETCORE_ENVIRONMENT
variável de ambiente ao executar / depurarComo definir variáveis de ambiente
Dependendo do seu IDE, há alguns lugares onde os projetos dotnet tradicionalmente procuram por variáveis de ambiente:
Para Visual Studio vá para Projeto> Propriedades> Depurar> Variáveis de Ambiente:
Para Visual Studio Code , edite
.vscode/launch.json
>env
:Usando as configurações de inicialização , edite
Properties/launchSettings.json
>environmentVariables
:Que também pode ser selecionado na barra de ferramentas do Visual Studio
Usando o dotnet CLI , use a sintaxe apropriada para definir as variáveis de ambiente de acordo com o seu sistema operacional
Como
Host.CreateDefaultBuilder
funciona?.NET Core 3.0 adicionado
Host.CreateDefaultBuilder
em extensões de plataforma que fornecerá uma inicialização padrãoIConfiguration
que fornece configuração padrão para o aplicativo na seguinte ordem:Leitura Adicional - MS Docs
fonte
No ASP.NET Core, você deve usar variáveis de ambiente em vez da configuração de compilação para appsettings.json adequados
Clique com o botão direito em seu projeto> Propriedades> Depurar> Variáveis de Ambiente
O ASP.NET Core usará o arquivo appsettings.json apropriado:
Agora você pode usar essa variável de ambiente assim:
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(); }
fonte
Você pode usar as variáveis de ambiente e a
ConfigurationBuilder
classe em seuStartup
construtor desta forma: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(); }
Em seguida, você cria um
appsettings.xxx.json
arquivo para cada ambiente de que precisa, com "xxx" sendo o nome do ambiente. Observe que você pode colocar todos os valores de configuração global em seuappsettings.json
arquivo "normal" e apenas colocar as coisas específicas do ambiente nesses novos arquivos.Agora você só precisa de uma variável de ambiente chamada
ASPNETCORE_ENVIRONMENT
com algum valor de ambiente específico ("live", "staging", "production", qualquer que seja). Você pode especificar essa variável nas configurações do projeto para o seu ambiente de desenvolvimento e, é claro, também precisa defini-la nos ambientes de teste e produção. A maneira como você faz isso depende de que tipo de ambiente é esse.ATUALIZAÇÃO: Acabei de perceber que você deseja escolher o com
appsettings.xxx.json
base em sua configuração de compilação atual . Isso não pode ser alcançado com a minha solução proposta e não sei se existe uma maneira de fazer isso. A forma de "variável de ambiente", entretanto, funciona e pode também ser uma boa alternativa para sua abordagem.fonte
Apenas uma atualização para usuários do .NET core 2.0, você pode especificar a configuração do aplicativo após a chamada para
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); } }
fonte
ASPNETCORE_ENVIRONMENT
. O valor é o que será substituídoctx.HostingEnvironment.EnvironmentName}
. Portanto, se você definir esse valor nas propriedades como 'Produção', o projeto irá procurar oconfig.Production.json
arquivo na pasta raiz. Para obter mais informações, consulte este linkError CS0266 Cannot implicitly convert type 'Microsoft.AspNetCore.Hosting.IWebHost' to 'Microsoft.AspNetCore.Hosting.IWebHostBuilder'. An explicit conversion exists (are you missing a cast?)
em WebHost.CreateDefaultBuiler (...Crie vários arquivos como:
appSettings.$(Configuration).json
appSettings.staging.json
appSettings.production.json
Crie um evento de pré-construção no projeto que copia o respectivo arquivo para
appSettings.json
:Use apenas
appSettings.json
no seu Config Builder:var builder = new ConfigurationBuilder() .SetBasePath(env.ContentRootPath) .AddJsonFile("appsettings.json", optional: false, reloadOnChange: true) .AddEnvironmentVariables(); Configuration = builder.Build();
fonte
Você pode adicionar o nome da configuração como
ASPNETCORE_ENVIRONMENT
nalaunchSettings.json
como abaixo"iisSettings": { "windowsAuthentication": false, "anonymousAuthentication": true, "iisExpress": { "applicationUrl": "http://localhost:58446/", "sslPort": 0 } }, "profiles": { "IIS Express": { "commandName": "IISExpress", "environmentVariables": { ASPNETCORE_ENVIRONMENT": "$(Configuration)" } } }
fonte
Esta é a versão que funciona para mim ao usar um aplicativo de console sem uma página da 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);
fonte
O arquivo .vscode / launch.json só é usado pelo Visual Studio, bem como o arquivo /Properties/launchSettings.json. Não use esses arquivos na produção.
O arquivo launchSettings.json:
contém configurações de perfil.
Para usar um arquivo 'appSettings.QA.json' por exemplo. Você pode usar 'ASPNETCORE_ENVIRONMENT'. Siga os passos abaixo.
fonte