Я определил некоторые значения в моем appsettings.json
для таких вещей, как строки подключения к базе данных, местоположения webapi и т.п., которые различаются для сред разработки, промежуточных и живых сред.
Есть ли способ иметь несколько appsettings.json
файлов (например appsettings.live.json
, и т. Д.), И приложение asp.net просто «знает», какой из них использовать, в зависимости от конфигурации сборки, которую оно запускает?
c#
asp.net-core
appsettings
tweetypi
источник
источник
Я добавил скриншоты рабочей среды, потому что это стоило мне нескольких часов исследований и разработок.
Сначала добавьте ключ в свой
launch.json
файл.См. Снимок экрана ниже, я добавил в
Development
качестве своей среды.Затем в своем проекте создайте новый
appsettings.{environment}.json
файл, включающий имя среды.На следующем снимке экрана найдите два разных файла с именами:
appsettings.Development.Json
appSetting.json
И, наконец, настройте его для своего
StartUp
класса следующим образом: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(); }
И, наконец, вы можете запустить его из командной строки следующим образом:
dotnet run --environment "Development"
где
"Development"
имя моего окружения.источник
IWebHostEnvironment
.Обновление для .NET Core 3.0+
Вы можете использовать,
CreateDefaultBuilder
который автоматически создаст и передаст объект конфигурации вашему классу запуска:public class Startup { public Startup(IConfiguration configuration) // automatically injected { Configuration = configuration; } public IConfiguration Configuration { get; } /* ... */ }
CreateDefaultBuilder
автоматически включает соответствующий файл, поэтому добавьте отдельный файл настроек приложения для каждой среды:appsettings.Environment.json
Затем установите
ASPNETCORE_ENVIRONMENT
переменную среды при запуске / отладкеКак установить переменные среды
В зависимости от вашей IDE есть пара мест, где проекты dotnet традиционно ищут переменные среды:
Для Visual Studio перейдите в Project> Properties> Debug> Environment Variables:
Для кода Visual Studio отредактируйте
.vscode/launch.json
>env
:Используя настройки запуска , отредактируйте
Properties/launchSettings.json
>environmentVariables
:Что также можно выбрать на панели инструментов в Visual Studio.
Используя интерфейс командной строки dotnet , используйте соответствующий синтаксис для установки переменных среды для вашей ОС.
Как
Host.CreateDefaultBuilder
работает?.NET Core 3.0 добавлен
Host.CreateDefaultBuilder
в расширения платформы, которые обеспечат инициализацию поIConfiguration
умолчанию, которая обеспечивает конфигурацию по умолчанию для приложения в следующем порядке:Дополнительная литература - Документы MS
источник
В ASP.NET Core вам лучше использовать переменные среды вместо конфигурации сборки для правильного appsettings.json
Щелкните правой кнопкой мыши проект> Свойства> Отладка> Переменные среды
ASP.NET Core будет использовать соответствующий файл appsettings.json:
Теперь вы можете использовать эту переменную среды следующим образом:
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(); }
источник
Вы можете использовать переменные среды и
ConfigurationBuilder
класс в своемStartup
конструкторе следующим образом: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(); }
Затем вы создаете
appsettings.xxx.json
файл для каждой нужной среды, где «xxx» является именем среды. Обратите внимание, что вы можете поместить все глобальные значения конфигурации в свой «нормальный»appsettings.json
файл, а в эти новые файлы поместить только специфические для среды данные.Теперь вам нужна только переменная среды, вызываемая
ASPNETCORE_ENVIRONMENT
с определенным значением среды ("live", "staging", "production", что угодно). Вы можете указать эту переменную в настройках вашего проекта для своей среды разработки, и, конечно же, вам необходимо также установить ее в промежуточной и производственной средах. То, как вы это сделаете, зависит от того, что это за среда.ОБНОВЛЕНИЕ: я только что понял, что вы хотите выбрать,
appsettings.xxx.json
исходя из вашей текущей конфигурации сборки . Этого нельзя достичь с помощью предлагаемого мной решения, и я не знаю, есть ли способ сделать это. Однако способ "переменной среды" работает и может быть хорошей альтернативой вашему подходу.источник
Просто обновление для пользователей .NET core 2.0, вы можете указать конфигурацию приложения после вызова
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); } }
источник
ASPNETCORE_ENVIRONMENT
. Значение - это то, что будет замененоctx.HostingEnvironment.EnvironmentName}
. Поэтому, если вы установите для этого значения в свойствах значение «Производство», проект будет искатьconfig.Production.json
файл в корневой папке. Для получения дополнительной информации, пожалуйста, просмотрите эту ссылкуError 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 (...Создайте несколько файлов, например:
appSettings.$(Configuration).json
appSettings.staging.json
appSettings.production.json
Создайте в проекте событие перед сборкой, которое копирует соответствующий файл в
appSettings.json
:Используйте только
appSettings.json
в вашем Config Builder:var builder = new ConfigurationBuilder() .SetBasePath(env.ContentRootPath) .AddJsonFile("appsettings.json", optional: false, reloadOnChange: true) .AddEnvironmentVariables(); Configuration = builder.Build();
источник
Вы можете добавить название конфигурации , как
ASPNETCORE_ENVIRONMENT
в ,launchSettings.json
как показано ниже"iisSettings": { "windowsAuthentication": false, "anonymousAuthentication": true, "iisExpress": { "applicationUrl": "http://localhost:58446/", "sslPort": 0 } }, "profiles": { "IIS Express": { "commandName": "IISExpress", "environmentVariables": { ASPNETCORE_ENVIRONMENT": "$(Configuration)" } } }
источник
Это версия, которая подходит мне при использовании консольного приложения без веб-страницы:
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);
источник
Файл .vscode / launch.json используется только Visual Studio, а также файл /Properties/launchSettings.json. Не используйте эти файлы в производстве.
Файл launchSettings.json:
содержит настройки профиля.
Например, использовать файл appSettings.QA.json. Вы можете использовать ASPNETCORE_ENVIRONMENT. Следуйте инструкциям ниже.
источник