it-roy-ru.com

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

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

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

28
tweetypi

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

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

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

Сначала добавьте ключ в ваш файл Launch.Json.

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

 enter image description here

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

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

  • appSettings.Development.Json
  • appSetting.json

 enter image description here

И, наконец, настройте его на свой класс 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 - среда "Развитие"

где развитие - это моя среда.

38
Bharat

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

   }
 }
19
Umut Esen

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

16
Onkel Toob

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

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

 enter image description here

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

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

6
walkerbox

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

1. Создайте несколько appSettings. $ (Configuration) .jsons like AppSettings.staging.json AppSettings.production.json

2. Создайте в проекте событие предварительной сборки, которое копирует соответствующий файл в appSettings.json следующим образом.

скопировать appSettings. $ (Конфигурация) .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();
0
user3924036