Объединение нескольких файлов конфигурации TypeSafe и разрешение только после их объединения

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

Я хочу иметь возможность объединить три разных файла конфигурации:

  • conf/env/default.conf — значения конфигурации по умолчанию для всех сред
  • conf/env/<env>.conf - значения, специфичные для среды
  • application.conf - переопределение пользователем любого из вышеперечисленных

Идея состоит в том, что я не хочу, чтобы все было в одном файле конфигурации, и есть риск неправильного редактирования, что приведет к потере элементов конфигурации. Поэтому вместо этого держите их отдельно и дайте пользователю возможность переопределить их.

Здесь все становится сложнее: default.conf будет включать ${ссылки} на вещи, которые должны быть переопределены в <env>.conf и могут быть дополнительно переопределены в application.conf.

Мне нужно отложить решение, пока все три не будут объединены. Как я могу это сделать?


person John Arrowwood    schedule 03.03.2016    source источник
comment
Я одобрил ответ Джона, и на него стоит сослаться https://github.com/lightbend/config#standard-behavior перед началом объединения ваших конфигураций.   -  person Ravindra    schedule 12.06.2019


Ответы (1)


Ответ заключается в использовании ConfigFactory.parseResource() вместо ConfigFactory.load().

Вот готовый результат

private lazy val defaultConfig     = ConfigFactory.parseResources("conf/env/default.conf")
private lazy val environmentConfig = ConfigFactory.parseResources("conf/env/" + env + ".conf" )
private lazy val userConfig        = ConfigFactory.parseResources("application.conf")
private lazy val config = ConfigFactory.load()
                          .withFallback(userConfig)
                          .withFallback(environmentConfig)
                          .withFallback(defaultConfig)
                          .resolve()
person John Arrowwood    schedule 07.03.2016
comment
Вероятно, это следует прояснить здесь github.com/typesafehub/config. - person Carlos Bribiescas; 02.08.2017
comment
В этом коде есть проблема: .resolve() будет получать значения из среды, но не из системных свойств. Пока не знаю, как это исправить. - person John Arrowwood; 27.11.2019
comment
Решение найдено. Отредактировал ответ, чтобы отразить его. - person John Arrowwood; 27.11.2019
comment
ПРИМЕЧАНИЕ. Использование .load() в начале может сделать userConfig ненужным в приведенном выше коде. Но принцип выражен, и это важная часть. - person John Arrowwood; 27.11.2019
comment
Вы должны использовать .empty() вместо .load(), чтобы убедиться, что defaultConfig используется как запасной. - person ShahinSorkh; 26.09.2020
comment
Я определенно хочу, чтобы он извлекал переменные среды и системные свойства. Если я использую .empty(), получу ли я такое поведение? - person John Arrowwood; 17.12.2020