Как управлять application.conf в нескольких средах с воспроизведением 2.0?
В Play 1.2 я могу префикс ключей конфигурации с помощью идентификатора фреймворка или режима приложения следующим образом:
# Production configuration
%prod.http.port=80
%prod.application.log=INFO
%prod.application.mode=prod
Но он не работает с 2.0.
Есть ли способ заставить его работать?
Ответы
Ответ 1
Play 2 не заставляет вас использовать какой-либо конкретный метод для управления вашей средой. Но он предоставляет вам мощные и гибкие инструменты для его реализации в соответствии с потребностями вашего проекта.
Например, общий шаблон поддерживает общие параметры среды в одном файле и имеет переопределения для среды в других файлах. Для этого вам понадобится настраиваемый глобальный объект (вы можете поместить его прямо в ./app/Global.scala
). Следующий код действителен как в версии 2.1.1 (Scala 2.10):
import java.io.File
import play.api._
import com.typesafe.config.ConfigFactory
object Global extends GlobalSettings {
override def onLoadConfig(config: Configuration, path: File, classloader: ClassLoader, mode: Mode.Mode): Configuration = {
val modeSpecificConfig = config ++ Configuration(ConfigFactory.load(s"application.${mode.toString.toLowerCase}.conf"))
super.onLoadConfig(modeSpecificConfig, path, classloader, mode)
}
}
Теперь вы можете поместить application.dev.conf
, application.test.conf
и application.prod.conf
в свой ./conf
с переопределениями среды (сохраняя общие настройки в application.conf
).
В этом примере мы полагаемся на собственную собственную игру mode
, которая, как правило, имеет смысл, но вы можете быть столь же гранулярными, как вы хотите, и использовать переменные среды или все, что вам нравится.
См. также: Configafe Config
Ответ 2
У меня тоже был этот вопрос, а ниже - лучший подход, который я узнал до сих пор. Я получил подсказку, задав аналогичный вопрос в группе Google Play 2.
В приложении application.config используется следующий синтаксис для переопределения значения конфигурации при наличии системного параметра:
# Local machine fallback URI
mongodb.uri="mongodb://192.168.56.101:27017/application"
# Env variable override
mongodb.uri=${?MONGOLAB_URI}
Значок вопроса означает, что вы не переопределяете переменную env, если она не установлена. Если вы просто используете ${MONGOLAB_URI}, вы ожидаете, что переменная будет установлена, и, я полагаю, вы получите какое-то исключение, если оно не установлено.
Для полноты, вот пример того, как вы прочитали значение:
lazy val mongoUri = current.configuration.getString("mongodb.uri").getOrElse("mongodb:///")
При таком подходе существует одно предостережение: убедитесь, что вы сохраняете конфигурацию своего системного параметра в SCM.
Ответ 3
Вы должны определить другой файл конфигурации с соответствующими свойствами
http://www.playframework.org/documentation/2.0/Configuration
Существует также механизм включения, который помогает вам определять значения по умолчанию в application.conf и переопределяет только то, что необходимо для производства
Ответ 4
Если вы хотите быть независимым от режимов запуска scala, вы можете использовать свойства JVM.
Поместите модифицированный пример @coffesnake в. /app/Global.scala:
import java.io.File
import play.api._
import com.typesafe.config.ConfigFactory
object Global extends GlobalSettings {
override def onLoadConfig(config: Configuration, path: File, classloader: ClassLoader, mode: Mode.Mode): Configuration = {
val environment = System.getProperty("environment")
val environmentSpecificConfig = config ++ Configuration(ConfigFactory.load(s"application.${environment}.conf"))
super.onLoadConfig(environmentSpecificConfig, path, classloader, mode)
}
}
Следующий запуск воспроизведения play
и запустите приложение с параметром окружения run -Denvironment=prod-server1
Не присоединяйте обе команды, это не работает, тогда
Глобальная конфигурация будет переопределена свойствами среды, относящимися к файлу:
./conf/application.prod-server1.conf
EDIT:
С точки зрения времени я видел, что это обходное решение не нужно. Лучше использовать механизм загрузки встроенной конфигурации Play
-Dconfig.file=/etc/play-application/foo-production.conf
Ответ 5
Я использую это решение:
in application.conf
Я определил конфигурации по умолчанию,
в myUsername.conf
Я включил конфигурацию по умолчанию и переопределил пользовательскую конфигурацию:
include "application.conf"
logger.application=DEBUG
тогда в Global.java
я загрузил конфигурацию, специфичную для пользователя (если она существует):
public Configuration onLoadConfig(Configuration config, File path,
ClassLoader classloader) {
String username = System.getProperty("user.name");
File confFile = new File(new File(path, "conf"), username + ".conf");
if (confFile.exists()) {
Logger.info("configuration file {} found", confFile.getName());
return new Configuration(ConfigFactory.load(confFile.getName()));
} else {
Logger.info(
"configuration file {} not found, using default application.conf",
confFile.getAbsolutePath());
return null;
}
}
Ответ 6
У нас просто несколько файлов application.conf, по умолчанию используется во время разработки, и у нас есть prod-applicaton.conf, которые мы просто копируем на место при развертывании.