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

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

есть ли способ иметь несколько appsettings.json файлы (например,appsettings.live.json, etc, etc) и имеют asp.net app просто "знать", какой из них использовать на основе конфигурации сборки он работает?

6 ответов


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

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

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

Сначала добавьте ключ к вашему .

см. ниже snap, я добавил "Development" как мое окружение.

enter image description here

затем добавьте файл appSetting с тем же именем в свой проект.

добавлена привязка, ищите 2 разных файла с именем с.

  • appSettings.Development.Json
  • appSetting.json

enter image description here

и, наконец, настройте его на свой класс запуска, как показано ниже.

    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 --среда "разработка"

где развитие моя окружающая среда.


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

теперь вам нужна только переменная среды под названием ASPNETCORE_ENVIRONMENT С какой-то конкретной значение окружающей среды ("живая"," постановка"," производство", что угодно). Эту переменную можно указать в параметрах проекта для среды разработки, и, конечно же, ее необходимо задать в промежуточной и рабочей средах. То, как вы это делаете, зависит от того, что это за среда.

обновление: я только что понял, что вы хотите выбрать 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);

   }
 }

In ASP.NET Core вы должны использовать EnvironmentVariables вместо конфигурации сборки для правильных appsettings.в JSON

Right click on you project > Properties > Debug > Environment Variables

enter image description here

ASP.NET ядро будет принимать правильные appsettings.файл json. Если вы это сделаете @Dmitry, у вас будут проблемы, например. при переопределении параметр appsettings.в JSON значения в Azure.


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