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

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

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

Ответ 1

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

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

Ответ 2

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

Сначала добавьте ключ в ваш файл 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 --environment "Разработка"

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

Ответ 3

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

UPDATE: Я просто понял, что вы хотите выбрать appsettings.xxx.json на основе вашей текущей конфигурации сборки. Это не может быть достигнуто с моим предлагаемым решением, и я не знаю, есть ли способ сделать это. Однако "переменная среды" работает и может быть хорошей альтернативой вашему подходу.

Ответ 4

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

   }
 }

Ответ 5

В 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 way, у вас будут проблемы, например. при переопределении значений appsettings.json в Azure.

Ответ 6

Вы можете добавить имя конфигурации как ASPNETCORE_ENVIRONMENT в launchSettings.json как launchSettings.json ниже

  "iisSettings": {
    "windowsAuthentication": false,
    "anonymousAuthentication": true,
    "iisExpress": {
      "applicationUrl": "http://localhost:58446/",
      "sslPort": 0
    }
  },
  "profiles": {
    "IIS Express": {
      "commandName": "IISExpress",
      "environmentVariables": {
        ASPNETCORE_ENVIRONMENT": "$(Configuration)"
      }
    }
  }

Ответ 7

1. Создайте несколько appSettings. $ (Configuration).jsons, таких как 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();

Ответ 8

Привет Попробовал вышеуказанные решения. но appsettings..json добавляется в корень проекта. как показано на снимке ниже

Щелчок