CSS プリプロセッサとして Sass を使用しており、アセット パイプライン経由で実行しようとしています。この sassTask をソース ファイル タスクおよび Web アセット タスクとして実装しようとしましたが、どちらの方法でも問題が発生しています。
Sass をソース タスクとして実行すると (以下を参照)、activator run
ページが要求されたときに Sass がトリガーされ、ページのリロード時に更新されたファイルが見つかります。私が直面している問題は、結果として得られる CSS ファイルがtarget/web/public/main/lib
、ディレクトリの下に組み込まれているものを反映するサブディレクトリではなく、すべて に直接ダンプされることresources-managed
です。これを実現する方法がわかりません。
代わりに、Sass コンパイルを Web アセット タスクとして実装してみました (以下を参照)。私が知る限り、この方法で作業しても意味がありresources-managed
ません。そのため、ファイルを直接 にコンパイルしますtarget/web/public/main/lib
。私はこれを十分に動的に行っていないと確信していますが、それ以上の方法はわかりません。しかし、ここでの最大の問題は、 を処理しているときにパイプラインが明らかに実行されないことactivator run
です。を使用して実行できactivator stage
ますが、Scala ファイルと同様に、開発サーバーの実行中にスタイル ファイルを変更できるように、通常の開発ワークフローでこれを機能させる必要があります。
これらのフォーラム、sbt-web ドキュメント、およびいくつかの既存のプラグインをくまなく調べてみましたが、SBT の複雑さと実際に起こっていることの不透明さのために、このプロセスは非常に苛立たしいものであることがわかりました。ビルドプロセス。
ソース ファイル タスクとしての Sass コンパイル:
lazy val sassTask = TaskKey[Seq[java.io.File]]("sassTask", "Compiles Sass files")
sassTask := {
import sys.process._
val x = (WebKeys.nodeModules in Assets).value
val sourceDir = (sourceDirectory in Assets).value
val targetDir = (resourceManaged in Assets).value
Seq("sass", "-I", "target/web/web-modules/main/webjars/lib/susy/sass", "--update", s"$sourceDir:$targetDir").!
val sources = sourceDir ** "*.scss"
val mappings = sources pair relativeTo(sourceDir)
val renamed = mappings map { case (file, path) => file -> path.replaceAll("scss", "css") }
val copies = renamed map { case (file, path) => file -> targetDir / path }
copies map (_._2)
}
sourceGenerators in Assets <+= sassTask
Web アセット タスクとしての Sass コンパイル:
lazy val sassTask = taskKey[Pipeline.Stage]("Compiles Sass files")
sassTask := {
(mappings: Seq[PathMapping]) =>
import sys.process._
val sourceDir = (sourceDirectory in Assets).value
val targetDir = target.value / "web" / "public" / "main"
val libDir = (target.value / "web" / "web-modules" / "main" / "webjars" / "lib" / "susy" / "sass").toString
Seq("sass", "-I", libDir, "--update", s"$sourceDir:$targetDir").!
val sources = sourceDir ** "*.scss"
val mappings = sources pair relativeTo(sourceDir)
val renamed = mappings map { case (file, path) => file -> path.replaceAll("scss", "css") }
renamed
}
pipelineStages := Seq(sassTask)