Play 1.2では、次のように構成キーの前にフレームワークIDまたはアプリケーションモードを付けることができます。
# Production configuration
%prod.http.port=80
%prod.application.log=INFO
%prod.application.mode=prod
しかし、2.0では動作しないようです。
それを機能させる方法はありますか?
Play 2では、環境を管理するために特定の方法を使用する必要はありません。ただし、プロジェクトのニーズに応じて自分で実装するための強力で柔軟なツールを提供します。
たとえば、一般的なパターンは、1つのファイルに共通の環境設定を保持し、他のファイルに環境固有のオーバーライドを設定することです。これを行うには、 カスタムグローバルオブジェクト が必要になります(./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
で共通の設定を維持しながら)配置できます。
このサンプルでは、通常は意味のあるPlay独自のmode
に依存していますが、必要に応じて細かく設定し、環境変数などを使用できます。
参照: Typesafe Config
私も長い間この質問をしました、そして以下は私がこれまでに学んだ最良のアプローチです、私はPlay2グーグルグループで同様の質問をするときにヒントを得ました。
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:///")
このアプローチでは、1つの注意点があります。システムパラメータ構成を何らかのSCMに保持するようにしてください。
適切なプロパティを使用して別の構成ファイルを定義する必要があります
http://www.playframework.org/documentation/2.0/Configuration
Application.confでデフォルト値を定義し、本番環境に必要なものだけをオーバーライドするのに役立つ包含メカニズムもあります。
再書き込みされた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
私はこのソリューションを使用しています:
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;
}
}
複数のapplication.confファイルがあり、開発中にデフォルトが使用され、デプロイ時に所定の場所にコピーするだけのprod-applicaton.confがあります。