Как управлять 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, которые мы просто копируем на место при развертывании.