我认为根据相关文件资产管道 https://github.com/sbt/sbt-web#asset-pipeline,源文件任务是一种方法:
作为插件的源文件任务的示例有 CoffeeScript、LESS 和
JSHint。其中一些采用源文件并生成目标网络
资产例如CoffeeScript 生成 JS 文件。此类别中的插件
就其功能而言是相互排斥的,即
只有一个 CoffeeScript 插件会采用 CoffeeScript 源并且
生成目标JS文件。综上所述,源文件插件产生web
资产。
我认为你想要实现的目标属于这一类。
TL;博士; -build.sbt
val sassTask = taskKey[Seq[File]]("Compiles Sass files")
val sassOutputDir = settingKey[File]("Output directory for Sass generated files")
sassOutputDir := target.value / "web" / "sass" / "main"
resourceDirectories in Assets += sassOutputDir.value
sassTask := {
val sourceDir = (sourceDirectory in Assets).value
val outputDir = sassOutputDir.value
val sourceFiles = (sourceDir ** "*.scss").get
Seq("sass", "--update", s"$sourceDir:$outputDir").!
(outputDir ** "*.css").get
}
sourceGenerators in Assets += sassTask.taskValue
解释
假设你有 sass 文件app/assets/<whatever>
目录,并且您要在其中创建 css 文件web/public/main/<whatever>
目录,这就是你可以做的。
创建一个任务,该任务将读取以下文件app/assets/<whatever>
目录和子目录,并将它们输出到我们定义的sassOutputDir
.
val sassTask = taskKey[Seq[File]]("Compiles Sass files")
val sassOutputDir = settingKey[File]("Output directory for Sass generated files")
sassOutputDir := target.value / "web" / "sass" / "main"
resourceDirectories in Assets += sassOutputDir.value
sassTask := {
val sourceDir = (sourceDirectory in Assets).value
val outputDir = sassOutputDir.value
val sourceFiles = (sourceDir ** "*.scss").get
Seq("sass", "--update", s"$sourceDir:$outputDir").!
(outputDir ** "*.css").get
}
但这还不够。如果你想保留目录结构,你必须添加你的sassOutputDir
to the resourceDirectories in Assets
。这是因为 sbt-web 中的映射是这样声明的:
mappings := {
val files = (sources.value ++ resources.value ++ webModules.value) ---
(sourceDirectories.value ++ resourceDirectories.value ++ webModuleDirectories.value)
files pair relativeTo(sourceDirectories.value ++ resourceDirectories.value ++ webModuleDirectories.value) | flat
}
这意味着所有未映射的文件都使用选择 http://www.scala-sbt.org/0.13/docs/Mapping-Files.html#Alternatives flat
战略。不过解决方法很简单,只需将其添加到您的build.sbt
resourceDirectories in Assets += sassOutputDir.value
这将确保保留目录结构。