Вопрос или проблема
Я работал с Java последние несколько лет и сейчас снова начинаю заниматься dotnet. У меня возникают проблемы с настройкой конфигураций так, как мне хотелось бы. Я хочу иметь такую структуру:
- appsettings.json — настройки по умолчанию, независимые от окружения
- appsettings.local.json — локальные специфические переопределения конфигурации
- appsettings.dev.json — специфические переопределения конфигурации для разработки
- appsettings.stage.json — специфические переопределения конфигурации для стадии
Проблема, с которой я сталкиваюсь, заключается в том, что когда используется файл appsettings.local.json (или любой другой файл специфического окружения), базовые значения в файле appsettings.json не загружаются, даже если файл appsettings.local.json не переопределяет их.
Код настройки конфигурации:
var builder = WebApplication.CreateBuilder(args);
var configuration = builder.Configuration;
configuration
.AddEnvironmentVariables()
.Build();
appsettings.json:
{
...
"Mctv": {
"Port": "8080",
"CORS": {
...
appsettings.local.json:
{
...
"Mctv": {
"Run-Environment": "local",
"CORS": {
...
Обратите внимание, что настройка Port не указана в файле appsettings.local.json, я хочу, чтобы использовалось значение из файла appsettings.json. Как мне это настроить, чтобы конфигурация, независимая от окружения, в appsettings.json учитывалась, когда она не переопределена значением в файле конфигурации специфического окружения?
Сейчас, когда я запускаю с
“ASPNETCORE_ENVIRONMENT”: “local”
используются только значения из файла application.local.json.
–ИЗМЕНЕНИЕ
Я видел несколько сообщений в Интернете, которые советуют делать что-то вроде этого:
var builder = WebApplication.CreateBuilder(args);
var configuration = builder.Configuration;
var environmentName = Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT");
configuration
.AddEnvironmentVariables()
.SetBasePath(Directory.GetCurrentDirectory())
.AddJsonFile("appsettings.json", reloadOnChange: true, optional: false)
.AddJsonFile($"appsettings.{environmentName}.json", reloadOnChange: true, optional: true)
.Build();
Но я получаю такое же поведение, когда пробую это.
Ответ или решение
Для того чтобы обеспечить загрузку значений из файла appsettings.json
, когда соответствующее значение не переопределяется в файле среды (например, appsettings.local.json
), необходимо правильно настроить порядок загрузки конфигурации в вашем приложении .NET Core.
Вот пример правильной настройки использования конфигурационных файлов:
var builder = WebApplication.CreateBuilder(args);
// Получаем имя текущей среды
var environmentName = Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT") ?? "Production";
// Настраиваем конфигурацию
builder.Configuration
.SetBasePath(Directory.GetCurrentDirectory())
.AddJsonFile("appsettings.json", optional: false, reloadOnChange: true)
.AddJsonFile($"appsettings.{environmentName}.json", optional: true, reloadOnChange: true)
.AddEnvironmentVariables();
var app = builder.Build();
Объяснение:
-
Порядок добавления файлов конфигурации: Важно добавлять файлы конфигурации в правильном порядке. Сначала загружается
appsettings.json
, в который помещаются основные, общие для всех сред настройки. Затем загружается файл для конкретной среды (например,appsettings.local.json
), где могут находиться специфические настройки. Если определённое значение в более специфичном файле отсуствует, то будет использовано значение изappsettings.json
. -
Параметры метода
AddJsonFile
:optional: false
для основного файлаappsettings.json
позволяет гарантировать, что приложение не запустится, если этот файл отсутствует.optional: true
для среды позволяет приложению продолжать работать, даже если файл среды (например,appsettings.local.json
) отсутствует.
-
Использование переменной окружающей среды для имени среды: С помощью
Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT")
вы динамически получаете имя среды, которая задается в вашем приложении. Если переменная не задана, в качестве значения по умолчанию используетсяProduction
.
Заключение
С данной конфигурацией ваше приложение будет корректно загружать значения из appsettings.json
, если соответствующие ключи отсутствуют в файле среды. Таким образом, вы получите желаемую конфигурационную структуру для разных сред разработки и сможете избежать проблем с переопределением значений.