2011-06-28 9 views
16

私はscalaアプリケーションを設定する方法が必要です。 ConfiggyはScalaに移行するように思われましたが、これは廃止されました。https://github.com/robey/configgy#readmeとなり、この機能はOstrichにあります。オーストリッチはどのように構成に使用されますか?

設定のためだけにオーストリッチを使用する方法のコード例はありますか?私は統計を収集することに興味がありません。

+4

を私は 'Configgy'の交換を書きました。それは、ほとんどのレガシー設定ファイル、akka設定ファイル、およびJavaプロパティと互換性があります。 https://github.com/paradigmatic/Configrity – paradigmatic

答えて

14

私は正式な回答も知っていますが、誰も答えなかったので、私は周りを突くことにしました。申し訳ありませんが、この答えはかなり包括的ではない場合。

私が見つけた最良の例はcom.twitter.ostrich.admin.RuntimeEnvironmentで、特に主にloadConfigを見た場合に見つかりました。

クラスTのインスタンスを設定したいとします。次のように基本的な考え方は次のとおりです。

  • com.twitter.util.Config[T]と評価さScalaのソースコードが含まれているjava.io.Fileを取得します。
  • Config[T]を有効にするには、def apply(): Tメソッドが必要です。実装の詳細を設定ファイルから外しておくには、プロジェクトにConfig[T]を拡張したクラスを定義したいと思うでしょう。このクラスを使用して、デフォルト/必須フィールドを定義することもできます。
  • 新しいcom.twitter.util.Evalインスタンスをインスタンス化し、を呼び出してConfig[T]インスタンスを取得します。
  • 不正な設定ファイルに対して適切な例外をスローするには、config.validate()を呼び出します。
  • config.apply()に電話して、Tの完全構成インスタンスを取得します。ここで

私は新しいWidgetServiceを設定する簡単な例です:

class WidgetService(val port: Int) 

class WidgetConfig extends com.twitter.util.Config[WidgetService] { 
    var port = required[Int] 
    def apply(): WidgetService = { 
    new WidgetService(port) 
    } 
} 

object MyApp extends App { 
    val configFile = new java.io.File("mywidget_config.scala") 
    val eval = new com.twitter.util.Eval 
    val config = eval[com.twitter.util.Config[WidgetService]](configFile) 
    config.validate() 
    val widgetService = config() 
    println(widgetService.port) 
} 

そして、ここではmywidget_config.scalaです:

new WidgetConfig { 
    port = 8000 
} 

注:あなたはあなたがこれを置けば変更を加える必要がありパッケージで。簡潔さのためにデフォルトパッケージですべてをやった。依存関係を動作させるために

、私は私のSBTの設定にこれを追加しました:

libraryDependencies += "com.twitter" % "util" % "1.10.1" 
+3

は非常に複雑に見えます –

+0

スカラファイルに値を書き戻すことは可能ですか?もしそれが私が古い良い.propertiesファイルを好むよりも簡単ではないならば、 – Matroska

+0

Matroska:スカラファイルに値を書き戻す組み込みのサポートはありませんが、一般的なケースのためにそれを行うコードを書くことは可能ですConfigのmissingValuesメソッドがどのようにフィールドをイントロスペクトできるか)。しかし、あなたの設定で厄介なことをすると、その情報が失われる可能性があります( 'port = 1024 + 1'を読み込みますが、' port = 1025'を書き戻します)。 – Mike

関連する問題