web-dev-qa-db-ja.com

play 2.0を使用していくつかの環境でapplication.confを管理する方法は?

Play 1.2では、次のように構成キーの前にフレームワークIDまたはアプリケーションモードを付けることができます。

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

しかし、2.0では動作しないようです。

それを機能させる方法はありますか?

22
tototoshi

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.confapplication.test.conf、およびapplication.prod.conf./confに、環境固有のオーバーライドを使用して(application.confで共通の設定を維持しながら)配置できます。

このサンプルでは、​​通常は意味のあるPlay独自のmodeに依存していますが、必要に応じて細かく設定し、環境変数などを使用できます。

参照: Typesafe Config

43
coffeesnake

私も長い間この質問をしました、そして以下は私がこれまでに学んだ最良のアプローチです、私は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に保持するようにしてください。

13
Magnus

適切なプロパティを使用して別の構成ファイルを定義する必要があります

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

Application.confでデフォルト値を定義し、本番環境に必要なものだけをオーバーライドするのに役立つ包含メカニズムもあります。

6
Seb Cesbron

再書き込みされた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
mgosk

私はこのソリューションを使用しています:

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

}
1
Antonio Salvati

複数のapplication.confファイルがあり、開発中にデフォルトが使用され、デプロイ時に所定の場所にコピーするだけのprod-applicaton.confがあります。

0
nylund