Автоматически устанавливать appsettings.json для сред разработки и выпуска в ядре asp.net?

98

Я определил некоторые значения в моем appsettings.jsonдля таких вещей, как строки подключения к базе данных, местоположения webapi и т.п., которые различаются для сред разработки, промежуточных и живых сред.

Есть ли способ иметь несколько appsettings.jsonфайлов (например appsettings.live.json, и т. Д.), И приложение asp.net просто «знает», какой из них использовать, в зависимости от конфигурации сборки, которую оно запускает?

tweetypi
источник

Ответы:

32

Вы можете использовать условную компиляцию:

public Startup(IHostingEnvironment env)
{
    var builder = new ConfigurationBuilder()
    .SetBasePath(env.ContentRootPath)
    .AddJsonFile("appsettings.json", optional: true, reloadOnChange: true)
#if SOME_BUILD_FLAG_A
    .AddJsonFile($"appsettings.flag_a.json", optional: true)
#else
    .AddJsonFile($"appsettings.no_flag_a.json", optional: true)
#endif
    .AddEnvironmentVariables();
    this.configuration = builder.Build();
}
Дмитрий
источник
26
Вы должны установить переменную среды в сборке MSBuild / TFS. Условная компиляция приводит к ошибкам, с которыми легко справиться в сборках CI. Т.е., .AddJsonFile ($ "appsettings. {Env.EnvironmentName} .json", необязательно: true)
Ник Тернер,
1
См. Мой ответ ( stackoverflow.com/a/50331886/1319086 ) для переменной среды
Джонатан Дракон,
9
Такой подход вынуждает перекомпилировать код специально для каждой среды, что делает невозможным его распространение / установку где-либо еще.
tvdias
1
Вопрос касался «знания конфигурации сборки»
Дмитрий
4
Это не следует отмечать как принятый ответ - хотя это решение, это не лучшая практика.
Charleh
96

Я добавил скриншоты рабочей среды, потому что это стоило мне нескольких часов исследований и разработок.

  1. Сначала добавьте ключ в свой launch.jsonфайл.

    См. Снимок экрана ниже, я добавил в Developmentкачестве своей среды.

    Объявление переменной окружения в launch.json

  2. Затем в своем проекте создайте новый appsettings.{environment}.jsonфайл, включающий имя среды.

    На следующем снимке экрана найдите два разных файла с именами:

    • appsettings.Development.Json
    • appSetting.json


    Просмотр проекта файлов JSON настроек приложения

  3. И, наконец, настройте его для своего 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();
    }
    
  4. И, наконец, вы можете запустить его из командной строки следующим образом:

    dotnet run --environment "Development"
    

    где "Development"имя моего окружения.

Бхарат
источник
2
Пробовал, и он отлично работает. VS2017 даже отображает разные версии, как в базовом файле. голосование за.
Роберто
1
как это сделать в ядре 2.2, поскольку среда ihosting не поддерживается
djack109
2
Вместо этого вы должны использовать @ djack109 IWebHostEnvironment.
alessandrocb
53

Обновление для .NET Core 3.0+

  1. Вы можете использовать, CreateDefaultBuilderкоторый автоматически создаст и передаст объект конфигурации вашему классу запуска:

    WebHost.CreateDefaultBuilder(args).UseStartup<Startup>();
    
    public class Startup
    {
        public Startup(IConfiguration configuration) // automatically injected
        {
            Configuration = configuration;
        }
        public IConfiguration Configuration { get; }
        /* ... */
    }
    
  2. CreateDefaultBuilderавтоматически включает соответствующий файл, поэтому добавьте отдельный файл настроек приложения для каждой среды:appsettings.Environment.json

    appsettings.env.json

  3. Затем установите ASPNETCORE_ENVIRONMENT переменную среды при запуске / отладке

Как установить переменные среды

В зависимости от вашей IDE есть пара мест, где проекты dotnet традиционно ищут переменные среды:

  • Для Visual Studio перейдите в Project> Properties> Debug> Environment Variables:

    Visual Studio - переменные среды

  • Для кода Visual Studio отредактируйте .vscode/launch.json> env:

    Код Visual Studio> Среда запуска

  • Используя настройки запуска , отредактируйте Properties/launchSettings.json> environmentVariables:

    Параметры запуска

    Что также можно выбрать на панели инструментов в Visual Studio.

    Раскрывающийся список настроек

  • Используя интерфейс командной строки dotnet , используйте соответствующий синтаксис для установки переменных среды для вашей ОС.

    Примечание . Когда приложение запускается с помощью dotnet run , launchSettings.jsonоно считывается, если доступно, а environmentVariablesпараметры в launchSettings.json переопределяют переменные среды.

Как Host.CreateDefaultBuilderработает?

.NET Core 3.0 добавлен Host.CreateDefaultBuilderв расширения платформы, которые обеспечат инициализацию по IConfigurationумолчанию, которая обеспечивает конфигурацию по умолчанию для приложения в следующем порядке:

  1. appsettings.jsonс помощью поставщика конфигурации JSON .
  2. appsettings.Environment.jsonс помощью поставщика конфигурации JSON . Например:
    • appsettings.Production.json или
    • appsettings.Development.json
  3. Секреты приложения при запуске приложения в среде разработки.
  4. Переменные среды, использующие поставщик конфигурации переменных среды .
  5. Аргументы командной строки с использованием поставщика конфигурации командной строки .

Дополнительная литература - Документы MS

KyleMit
источник
Спасибо, это хорошо, но как это сделать с консольным процессом (или шаблоном рабочего процесса / шаблоном)?
hB0,
44

В ASP.NET Core вам лучше использовать переменные среды вместо конфигурации сборки для правильного appsettings.json

  1. Щелкните правой кнопкой мыши проект> Свойства> Отладка> Переменные среды

    переменные среды

  2. ASP.NET Core будет использовать соответствующий файл appsettings.json:

    пример файлов настроек приложения в обозревателе решений

  3. Теперь вы можете использовать эту переменную среды следующим образом:

    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();
    }
    

Примечание . Если вы используете ответ @Dmitry , у вас могут возникнуть проблемы, например. при переопределении значений appsettings.json в Azure.

Джонатан Дракон
источник
35

Вы можете использовать переменные среды и 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исходя из вашей текущей конфигурации сборки . Этого нельзя достичь с помощью предлагаемого мной решения, и я не знаю, есть ли способ сделать это. Однако способ "переменной среды" работает и может быть хорошей альтернативой вашему подходу.

Онкель Туб
источник
Я рассмотрел использование переменных среды в разделе свойств проекта-> отладка, однако нет очевидного способа, как это изменится в зависимости от настроек проекта. Это еще один файл, который я могу добавить в свой проект для его обработки?
tweetypi
Установка переменной в свойствах проекта будет работать только для ее использования в вашей среде разработки (возможно, Visual Studio). Вам нужно будет установить его в другом месте для развернутых приложений в зависимости от конкретной среды (IIS, Azure). Я бы не рекомендовал устанавливать переменную в каком-либо файле конфигурации, потому что этот файл тоже может быть развернут, а затем переопределить значения сервера.
Онкель Туб
Вы настраиваете его в конфигурациях сборки. Если файла конфигурации сборки нет, они делают это вручную, поэтому им нужно будет настроить его в (архаичном) профиле развертывания
Ник Тернер,
У меня есть несколько сред, таких как тестовая, промежуточная и производственная в Azure. Где мне изменить переменную ASPNETCORE_ENVIRONMENT, если я хочу опубликовать сборку релиза веб-приложения из VS в Azure?
морозный
Мы не меняем переменные во время развертывания, вместо этого они встроены в конкретную среду. В Azure эти значения можно установить непосредственно в конфигурации службы приложений в разделе «Параметры приложения». Не забудьте пометить их как «Настройки слота развертывания», если вы работаете с несколькими слотами.
Онкель Туб
29

Просто обновление для пользователей .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);

   }
 }
Umutesen
источник
1
Как вы переключаетесь между используемыми средами? Должны ли быть внесены изменения в какой-либо файл конфигурации? Я понимаю, что мне нужно добавить URL-адрес, который я хочу использовать при запуске проекта в Azure, в appsettings.json, а URL-адрес, который я хочу выполнить при локальном запуске (с помощью F5), в appsettings.Development.json . Это верно? Моя строка, которую я хочу использовать, находится в файле launchSettings.json, и я немного не понимаю, как изменить ее в зависимости от того, где выполняется приложение (или если оно вообще должно быть изменено).
DonkeyBanana
3
@DonkeyBanana Среда - это не что иное, как параметр, указанный в свойствах проекта. В VS 2017 щелкните правой кнопкой мыши проект> свойства. В разделе отладки вы увидите текущую среду для ключа ASPNETCORE_ENVIRONMENT. Значение - это то, что будет заменено ctx.HostingEnvironment.EnvironmentName}. Поэтому, если вы установите для этого значения в свойствах значение «Производство», проект будет искать config.Production.jsonфайл в корневой папке. Для получения дополнительной информации, пожалуйста, просмотрите эту ссылку
umutesen
Создает 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 (...
Hecatonchires
Стоит отметить, что здесь говорится: «AddJsonFile автоматически вызывается дважды, когда вы инициализируете новый конструктор хоста с помощью CreateDefaultBuilder». Другими словами, он уже загружает appSettings.json, а затем, в зависимости от конфигурации вашей среды, загружает настройки приложения. {Environment} .json
Дэвид Йейтс
13
  1. Создайте несколько файлов, например:appSettings.$(Configuration).json

    • appSettings.staging.json
    • appSettings.production.json
  2. Создайте в проекте событие перед сборкой, которое копирует соответствующий файл в appSettings.json:

    copy appSettings.$(Configuration).json appSettings.json
    
  3. Используйте только appSettings.jsonв вашем Config Builder:

    var builder = new ConfigurationBuilder()
                .SetBasePath(env.ContentRootPath)
                .AddJsonFile("appsettings.json", optional: false, reloadOnChange: true)
                .AddEnvironmentVariables();
    
    Configuration = builder.Build();
    
user3924036
источник
Это должен быть принятый ответ. В сложных случаях можно использовать SlowCheetah .
Антон Круглов,
8

Вы можете добавить название конфигурации , как 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)"
      }
    }
  }
Флика Дэн
источник
2

Это версия, которая подходит мне при использовании консольного приложения без веб-страницы:

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);
Ник Кордова
источник
0

Файл .vscode / launch.json используется только Visual Studio, а также файл /Properties/launchSettings.json. Не используйте эти файлы в производстве.

Файл launchSettings.json:

  1. Используется только на локальной машине разработки.
  2. Не развернут.
  3. содержит настройки профиля.

    • Значения среды, установленные в launchSettings.json, переопределяют значения, установленные в системной среде

Например, использовать файл appSettings.QA.json. Вы можете использовать ASPNETCORE_ENVIRONMENT. Следуйте инструкциям ниже.

  1. Добавьте новую переменную среды на хост-компьютер и назовите ее «ASPNETCORE_ENVIRONMENT». Установите его значение «QA».
  2. Создайте в своем проекте файл appSettings.QA.json. Добавьте сюда свою конфигурацию.
  3. Выполните развертывание на компьютере на шаге 1. Убедитесь, что appSettings.QA.json развернут.
  4. Загрузите свой сайт. Ожидайте, что здесь будет использоваться appSettings.QA.json.
Окс Ксен
источник