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

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

meds

Ответов: 10

Ответы (10)

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

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

Вы можете добавить имя конфигурации как 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)"
      }
    }
  }

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

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

    environment variables

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

    example of appsettings files in solution explorer

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

    общедоступный запуск (IHostingEnvironment env)
    {
        var builder = новый ConfigurationBuilder ()
            .SetBasePath (env.ContentRootPath)
            .AddJsonFile ("appsettings.json", необязательно: true, reloadOnChange: true)
            .AddJsonFile ($ "appsettings. {Env.EnvironmentName} .json", необязательно: true)
            .AddEnvironmentVariables ();
    
        Конфигурация = builder.Build ();
    }
    

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

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

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

    WebHost.CreateDefaultBuilder (аргументы) .UseStartup  ();
    
    запуск открытого класса
    {
        public Startup (конфигурация IConfiguration) // вводится автоматически
        {
            Конфигурация = конфигурация;
        }
        общедоступная конфигурация IConfiguration {получить; }
        / * ... * /
    }
    
  2. CreateDefaultBuilder автоматически включает соответствующие настройки приложения.Среда.json файл, поэтому добавьте отдельный файл настроек приложения для каждой среды:

    appsettings.env.json

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

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

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

  • Для Visual Studio перейдите в Проект> Свойства> Отладка> Переменные среды:

    Visual Studio - Environment Variables

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

    Visual Studio Code > Launch Environment

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

    Launch Settings

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

    Launch Settings Dropdown

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

    Примечание: при запуске приложения с 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. Например:
    • настройки приложения.Производство.json или
    • настройки приложения.Разработка.json
  3. Секреты приложения при запуске приложения в среде разработки.
  4. Переменные среды, использующие поставщик конфигурации переменных среды.
  5. Аргументы командной строки с использованием Поставщика конфигурации командной строки.

Дополнительная информация - MS Docs

  1. Создание нескольких appSettings.$ (Конфигурация).json файлов, например:

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

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

    var builder = new ConfigurationBuilder ()
                .SetBasePath (env.ContentRootPath)
                .AddJsonFile ("appsettings.json", необязательно: false, reloadOnChange: true)
                .AddEnvironmentVariables ();
    
    Конфигурация = builder.Build ();
    

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

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

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

   }
 }

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

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

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

    Declaration of the environment variable in launch.json

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

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

    • appsettings.Development.Json
    • appSetting.json


    Project view of appsettings JSON files

  3. И, наконец, настройте его для своего класса StartUp следующим образом:

    публичный запуск (IHostingEnvironment env)
    {
        var builder = новый ConfigurationBuilder ()
            .SetBasePath (env.ContentRootPath)
            .AddJsonFile ("appsettings.json", необязательно: false, reloadOnChange: true)
            .AddJsonFile ($ "appsettings. {Env.EnvironmentName} .json", необязательно: true)
            .AddEnvironmentVariables ();
    
        Конфигурация = builder.Build ();
    }
    
  4. И, наконец, вы можете запустить его из командной строки вот так:

    dotnet run - Environment «Разработка»
    

    , где «Разработка» - это имя моей среды.

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

.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.

2022 WebDevInsider