SBT-Web と Play Framework に基づくプロジェクトがあります。Play は開発のためだけに使用され、( stage
SBT/Activator でコマンドを実行すると) すべてが静的ページにエクスポートされ、Java がインストールされていない Web サーバーにデプロイされます。
私の現在のアプローチは、resourceGenerator を追加することです。
resourceGenerators in Assets += Def.task {
for(year <- PageGenerator.Years) yield {
val file = (resourceManaged in Assets).value / "assets" / s"${year.year}.html"
println(s"Writing $file…")
IO.write(file, PageGenerator.forYear(year))
file
}
}.taskValue
これは今のところ機能しますが、いくつかの欠点があります。
- 何よりもまず、サブディレクトリを使用できません。ファイルをサブディレクトリに配置しようとすると、ルートに配置されます。
- テンプレートまたはソース データを変更すると、有効にするためにプロジェクトをリロードする必要があります。
- 最後に、Twirl などを使用していただければ幸いです。
それらの欠点を克服する方法は?(最初のものが最も重要です。他の欠点を解決することは、むしろ小さな利点です。)
- 生成コードをパイプライン ステージに配置しようとしました。これは、最終成果物を構築するときに機能しますが、開発中は機能しません。
- アイデア: Twirl テンプレートを使用し、開発中に動的に呼び出し、パイプライン ステージで何らかの方法で (ClassLoader と Reflection API を使用して) 呼び出します。これが正しい方法かどうかはわかりません。sbt-web パイプライン ステージを実行するときに、Scala/Twirl コードが既にコンパイルされていることは保証されていますか?
- ハックなアイデア: ファイルをプロジェクト ルートに生成し、開発モードでルートを介して動的に提供し、パイプライン ステージで名前を変更します。これは重いハックですが、理論的にはうまくいくはずです。