ScalatraとScalateの組み合わせでWebアプリを作っているのですが、sbtでxsbt-scalate-precompile-pluginというプラグインを使うとScalateのテンプレートファイルのプリコンパイルを行うことができます。Scalateのテンプレートのコンパイルは結構遅いので、性能面ではプリコンパイルはかなり有効です。
ただし、現状のxsbt-scalate-precompile-plugin 1.5はネストしたディレクトリに配置されたテンプレートを処理できないようです。機能ごとにテンプレートをディレクトリに分けたかったり、共通レイアウトのテンプレートを使いたい(/WEB-INF/scalate/layoutsディレクトリに配置する必要がある)といった場合これは大問題です。
自分の場合、/WEB-INF/scalate/layouts/default.scamlにレイアウト用のテンプレートを置いていました。まず最初はbuild.sbtに以下のように記述してみました。
scalateTemplateDirectories in Compile <<= ( scalateTemplateDirectories in Compile, baseDirectory) { (dirs, basedir) => dirs ++ Seq( new File(basedir, "/src/main/webapp/WEB-INF")) } )
これだとWEB-INFの直下にあるテンプレートしか処理してくれません。次に試したのはこんな設定。
scalateTemplateDirectories in Compile <<= ( scalateTemplateDirectories in Compile, baseDirectory) { (dirs, basedir) => dirs ++ Seq( new File(basedir, "/src/main/webapp/WEB-INF"), new File(basedir, "/src/main/webapp/WEB-INF/scalate/layouts")) } )
こうすると確かに/WEB-INF/scalate/layouts/default.scamlは処理されるのですが、デフォルトパッケージとしてプリコンパイルされてしまいました(本当は/WEB-INFを起点としてscalate.layoutsパッケージとしてコンパイルする必要があります)。
ソースを見たところ、scalateTemplateDirectoriesに指定したディレクトリ直下のテンプレートしか処理しておらず、パッケージ名もデフォルトパッケージ固定になっているようだったので諦めてxsbt-scalate-precompile-pluginを自分で修正することにしました。という話。以下のパッチでネストしたディレクトリ内のテンプレートを正しいパッケージ名でプリコンパイルできるようになります。
https://gist.github.com/1316239
本家にもフィードバックしてみました。とりあえずは自分で修正したプラグインを使っているので困ってはいないのですが、本家で対応してくれるといいな…。
https://github.com/zentrope/xsbt-scalate-precompile-plugin/issues/4
追記:以下のコミットで早速パッチを取り込んでいただけたようです。次のバージョン(1.6)からはネストしたディレクトリに格納されたテンプレートも正しくプリコンパイルしてくれるようになるはずです。
https://github.com/zentrope/xsbt-scalate-precompile-plugin/commit/49baba8147906f34154c50bec4d7a204e0b440c9