構文も大分忘れている状態なんですが、またちょっとはじめることに。
というか実践。
sbt を使ってちょっとしたバッチを開発時に jar に含める設定ファイル(ログレベル設定等)を、開発、ステージング、本番用に切り替えたくなった。そして嵌った・・・約 2 日・・・
とりあえず設定ファイルの構成は、Java の時にやっていた構成で、
+ src + main (開発) + scala + resources + logback.xml + ... + product (本番) + resources + logback.xml + staging (ステージング) + resources + logback.xml |
始める sbt のスコープ軸を見ると、タスク毎に設定が出来そう。ということで、最初のアプローチは、pack-staging, pack-product のタスクを生成して、タスクのスコープで unmanagedResourceDirectory を追加しようとした。が、そこから呼び出す copy-resources は copy-resources in Compile になってしまい挫折・・・これに 1 日以上費やしたわけだが・・・結局わからなかった・・・
で、maven の profile 的なことができないかと検索してみると参考になるサイトがあった。
ここを参考に、
1 2 3 4 5 6 7 8 | case class Profile(name : String) object Profile { val staging = Profile( "staging" ) val product = Profile( "product" ) implicit def toOption(profile : Profile) : Option[Profile] = Option(profile) } |
1 2 3 | unmanagedResourceDirectories in Compile << = (sourceDirectory, selectedProfile, unmanagedResourceDirectories in Compile) ((dir, env, res) = > env.map((dir / _ .name / "resources" )).toSeq ++ res), unmanagedResources in Compile~ = ( _ .groupBy(( _: java.io.File).getName).map( _ . _ 2 .head).toSeq), |
記号がさっぱりわからん・・・Perl とまでは言わんが・・・演算子でなくメソッドなので色々できるわけだが、C++ みたいに標準的な演算子のみオーバーライドできればいいのに・・・ ライブラリ毎に覚えるのは大変だ・・・ 標準的な意味合いの記号があるのだろうか。
とりあえず sbt の API ドキュメントより、Setting[T] の <<= メソッドを見てみると trait DefinableSetting[S] に定義があり、
1 | final def << = (app : Initialize[T]) : Setting[T] |
1 2 | (sourceDirectory, selectedProfile, unmanagedResourceDirectories in Compile) ((dir, env, res) = > env.map((dir / _ .name / "resources" )).toSeq ++ res) |
で、右辺部分だが、
1 | (sourceDirectory, selectedProfile, unmanagedResourceDirectories in Compile)(なんかの処理) |
1 | (タプル).apply(なんかの処理) |
というわけで、ソースコードを implisit で grep すると、Structure.scala で
1 | implicit def t 3 ToApp 3 [A,B,C](t 3 : (Initialize[A], Initialize[B], Initialize[C]) ) : Apply 3 [A,B,C] = new Apply 3 (t 3 ) |
1 | def apply[T](z : (A,B,C) = > T) = Project.app( k 3 (t 3 ) )( hf 3 (z) ) |
1 | def app[HL < : HList, T](inputs : KList[Initialize, HL])(f : (HL) ⇒ T) : Initialize[T] |
次に、なんかの処理部分は、Apply3 の apply の引き数なので、
1 | (A,B,C) = > T |
unmanagedResourceDirectories が SettingKey[Seq[File]] なので、res は Seq[File] とおもわれる。
そして、生成したパスと res を連結したものが返ると。
最終的に返った、Initialize[Seq[File]] で unmanagedResourceDirectories in Compile を設定しているようだ。
とりあえず、今回はここまで。
追うのだけでも大変・・・自分でカスタマイズ出来る気がしない・・・Scala は嫌いじゃないけど慣れないと、読むのも困難だな・・・