Scala アプリケーションのコンフィグレーションに Twitter 製の util-eval を使ってみた
Scala アプリケーションの設定ファイルをどの形式で記述しようかと調べたら Twitter 製の util-eval が良い感じだったので紹介する。
util-eval とは
util-eval は Scala コードをインタープリター的に評価するライブラリ。Scala コードを動的に読むことで設定ファイルとして利用することを目的としている。
Scala コードを設定ファイルとすることは YAML, JSON, properties と比較して下記の利点がある。
- 強い型付けとコンパイラのチェックを受ける。コンパイルできない場合は例外を吐いてくれる。
- Scala コードなので強力な言語機能やライブラリの恩恵を受けられる
リポジトリ
2011.07 現在、github より Maven の方がバージョンが進んでいる。Twitter 社は全体的に github より Maven リポジトリの方が更新が早いみたい。ここは是非 github のコードも同期してもらいたいところ。
sbt 設定
0.10.x 系で取得した。build.sbt に下記を追記。
resolvers += "T repo" at "http://maven.twttr.com/" libraryDependencies += "com.twitter" % "util-eval" % "1.10.1" withSources()
末尾の withSources() ついては 次の節にまとめてみた。
sbt の withSources() について
sbt は dependency の末尾に withSources() を付けると update タスクで $HOME/.ivy2/cache/groupId/artifactId/srcs 以下に source-jar を取得してくれる。これを利用すれば IDE から参照したりできて良い感じになるのかな?と思ったのだけど、どうも上手くいかなかったので格闘の記録を一応残しておく。
sbteclipse 1.2 で eclipse タスクに with-sources オプションが追加された。 これを使えば withSource() で取得した source-jar と関連付いた .classpath を生成してくれるのかと推測したら、どうも違った。
with-sources オプションを付けると再度リポジトリから source-jar を取得し。$HOME/.ivy2/cache/groupId/artifactId/jars 以下に source-jar を保存し、.classpath の sourcepath 属性と関連付ける。これで、問題なく source-jar を IDE から覗けるようになるんだけど、本来なら再度 source-jar を取得せずに srcs 以下に既にある source-jar を参照してもらいたいような気がする。この辺りの挙動がバグなのかどうなのか理解できていない。まあ関連付け自体は成功したので、オーケーとしている。
なお IDEA の sbt 統合である sbt-idea でも似たような関連付けは実装されているらしい。
色々書いたけど実は Scala は Vim で書くのに慣れちゃったので、Eclipse にある程度入門できたら、また Vim に戻ろうかなあとか揺れている。
Configgy との関係
Scala のコンフィグレーション・ライブラリは Configgy という独自フォーマットのライブラリがこれまでポピュラーだったらしい。ロギング関連の機能も持っているとか。
ただ、Configgy 本家の README にもあるように今後は Configgy は廃止していって util-logging と util-eval に徐々に役割を移していく考えのようだ。
しかし、util-eval に限らず Twitter 製のライブラリは基本的に Scala 2.9 対応をしていない。対して Deprecated なはずの Configgy は 2.9 対応したブランチを持っている、というちょっと微妙な構図になっている。
github に最新のコードがあがっていれば folk して 2.9 対応すれば良いってことになるんだけど、現状だと Twitter 社の対応に期待するという感じになってしまっている。
Scala 2.9 での動作
上記のような事情もあるが、util-eval を 2.9 で使えるか試してみた。ivy の設定ファイル 上では対応バージョンは 2.8.1 となっているが、2.9 でも特に問題なく使えた。あくまで、たまたま動いた、という事なんだろうけど、今回はまあいいかな。
雑感
util-eval の Typesafe な設定ファイル、という考えは Scala らしいし、しっくりくる。 設定ファイルは、リソースパスの通った jar, war にも置けるし、ファイルシステムにも置けるので問題も少ない。
その他感じたことをまとめ。
- Twitter 製ライブラリは 2.9 対応していないので注意。今後どうなっていくのだろうか?
- Twitter ライブラリの現状を追うなら maven.twttr.com を見るのが吉。でも github のミラーは最新に同期にしててほしいな。
- sbt の Build.scala も Scala コードの設定ファイル、という似た者同士なので、内部に似たような仕組みを持っているのかなー、とか思った。sbt.compiler.Eval あたりなのかな?