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


98

Я визначив деякі значення в моєму appsettings.jsonдля таких речей, як рядки підключення до бази даних, розташування веб-сайтів та подібні, які відрізняються для середовищ розробки, індексації та реального часу.

Чи є спосіб мати кілька appsettings.jsonфайлів (наприклад appsettings.live.json, тощо, тощо), а програма asp.net просто `` знати '', який із них використовувати на основі конфігурації збірки, яку вона працює?

Відповіді:


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 ) для змінної Environment
Jonatan Dragon

9
Такий підхід змушує перекомпілювати код спеціально для кожного середовища, унеможливлюючи його перерозподіл / встановлення в іншому місці.
tvdias

1
Питання було про “знання про конфігурацію збірки”
Дмитро

4
Це не повинно позначатися як прийнята відповідь - хоча це рішення, це не найкраща практика.
Шарле

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, оскільки ihostingenvironment припинено
djack109

2
@ djack109 IWebHostEnvironmentзамість цього слід використовувати .
alessandrocb

54

Оновлення для .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 перейдіть до Проект> Властивості> Налагодження> Змінні середовища:

    Visual Studio - Змінні середовища

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

    Код Visual Studio> Запуск середовища

  • За допомогою налаштувань запуску редагуйте Properties/launchSettings.json> environmentVariables:

    Налаштування запуску

    Які також можна вибрати на панелі інструментів у Visual Studio

    Запуск спадного меню налаштувань

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

    Примітка : Коли додаток запускається із запуском точки , 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


Дякую, це добре, але як це зробити за допомогою консольного процесу (або шаблону робочого процесу / риштування)?
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). Я не рекомендую встановлювати змінну в якомусь файлі конфігурації, оскільки цей файл також може бути розгорнутий, а потім замінити значення сервера.
Onkel Toob

Ви встановлюєте його в конфігураціях збірки. Якщо файлу конфігурації збірки немає, тоді вони роблять це вручну, тому їм потрібно буде встановити його в (архаїчному) профілі розгортання
Нік Тернер,

У мене є кілька середовищ, таких як тестування, постановка та виробництво в Azure. Де я можу змінити змінну ASPNETCORE_ENVIRONMENT, якщо я хочу опублікувати випуск збірки веб-програми з VS на Azure?
морозний

Ми не змінюємо змінні під час розгортання, натомість вони вбудовані в конкретне середовище. В Azure ви можете встановити ці значення безпосередньо в конфігурації служби додатків, до "Налаштування програми". Не забудьте позначити їх як "Налаштування слота розгортання", якщо ви працюєте з кількома слотами.
Onkel Toob

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

   }
 }

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

Це має бути прийнятою відповіддю. У складних випадках може бути використаний SlowCeetah .
Антон Круглов

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.
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.