Как управлять application.conf в нескольких средах с помощью play 2.0? - PullRequest
22 голосов
/ 15 марта 2012

В Play 1.2 я могу добавить префикс конфигурационных ключей к идентификатору платформы или режиму приложения следующим образом:

# Production configuration
%prod.http.port=80
%prod.application.log=INFO
%prod.application.mode=prod

Но, похоже, он не работает с 2.0.есть ли способ заставить его работать?

Ответы [ 6 ]

43 голосов
/ 11 апреля 2013

Игра 2 не заставляет вас использовать какой-либо конкретный метод для управления вашей средой.Но он предоставляет вам мощные и гибкие инструменты для самостоятельной реализации его в соответствии с потребностями вашего проекта.

Например, общий шаблон - это сохранение общих настроек среды в одном файле и переопределений, специфичных для среды, в других файлах.Для этого вам понадобится пользовательский глобальный объект (вы можете поместить его прямо в ./app/Global.scala).Следующий код действителен с Play 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 Play, который обычно имеет смысл, но вы можете быть настолько гранулированными, насколько захотите, и использовать переменные среды иликак вам хочется.

Смотри также: Typesafe Config

13 голосов
/ 18 мая 2012

У меня тоже был этот вопрос в течение долгого времени, и ниже представлен лучший из известных мне подходов. Я получил подсказку, когда задавал аналогичный вопрос в группе 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.

6 голосов
/ 15 марта 2012

Вы должны определить другой файл конфигурации с соответствующими свойствами

http://www.playframework.org/documentation/2.0/Configuration

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

4 голосов
/ 06 февраля 2014

Если вы хотите быть независимым от ограниченных режимов запуска 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

1 голос
/ 20 января 2014

Я использую это решение:

в 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;
    }

}
0 голосов
/ 12 ноября 2012

У нас всего несколько файлов application.conf, по умолчанию используется во время разработки, и у нас есть prod-applicationaton.conf, который мы просто копируем на место при развертывании.

...