如何在play 2.0的几个环境中管理application.conf?

时间:2012-03-15 15:45:45

标签: playframework-2.0

使用Play 1.2,我可以使用框架ID或应用程序模式为配置键添加前缀,如下所示:

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

但它似乎不适用于2.0。

有没有办法让它发挥作用?

6 个答案:

答案 0 :(得分:43)

Play 2并不强制您使用任何特定方法来管理您的环境。但它为您提供了强大而灵活的工具,可以根据项目的需要自行实施。

例如,常见模式是将公共环境设置保存在一个文件中,并在其他文件中具有特定于环境的覆盖。为此,您需要custom Global object(您可以将其直接放入./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.confapplication.test.confapplication.prod.conf放入具有特定环境覆盖的./conf中(同时保留application.conf中的常用设置)。< / p>

在此示例中,我们依赖于Play自己的mode,这通常是有意义的,但您可以根据需要使用环境变量或任何您想要的内容。< / p>

另请参阅:Typesafe Config

答案 1 :(得分:13)

我已经有这个问题很长一段时间以下是我迄今为止学到的最好的方法,我在Play 2 google小组上提出类似的问题时得到了一个暗示。

在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中。

答案 2 :(得分:6)

您必须使用适当的属性

定义不同的配置文件

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

还有一个包含机制可以帮助您在application.conf中定义默认值,并仅覆盖生产所需的内容

答案 3 :(得分: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

编辑:

从时间角度来看,我看到这种解决方法是不必要的。最好使用Play内置配置加载机制 -Dconfig.file=/etc/play-application/foo-production.conf

答案 4 :(得分:1)

我正在使用这个解决方案:

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

}

答案 5 :(得分:0)

我们只有多个application.conf文件,默认在开发过程中使用,我们有一个prod-applicaton.conf,我们只需在部署时复制到位。