不能让sbt-concat从sbt-sass或sbt-less中捆绑样式

acj*_*jay 6 scala playframework-2.0 sbt-web sbt-concat

(提供的示例项目)我无法让sbt-concat按照设计来查找和连接由可能从预处理器任务生成的样式产生的样式表.在我的生产应用程序中,我正在尝试使用它来捆绑来自sbt-sass的精选缩小的输出文件.它在该项目的复杂设置中不起作用,因此我创建了一个示例项目,看看我是否可以让它工作.它在示例项目中也不起作用.这是一个测试项目build.sbt,尝试创建几个包,几乎所有我能想到的可能性,只是为了看看它们是否有效(公共Github repo,你应该能够克隆并立即复制问题):

import com.typesafe.sbt.web.Import.WebKeys._
import com.typesafe.sbt.web.pipeline.Pipeline

name := """sbt-concat-test"""

version := "1.0-SNAPSHOT"

lazy val root = (project in file(".")).enablePlugins(PlayScala, SbtWeb)

scalaVersion := "2.11.1"

libraryDependencies ++= Seq(
  jdbc,
  anorm,
  cache,
  ws
)

resolvers += Resolver.sonatypeRepo("releases")

includeFilter in (Assets, LessKeys.less) := "*.less"

excludeFilter in (Assets, LessKeys.less) := "_*.less"

val myPipelineTask = taskKey[Pipeline.Stage]("Some pipeline task")

myPipelineTask := { mappings => println(mappings); mappings }

pipelineStages := Seq(myPipelineTask, concat)

Concat.groups := Seq(
  "style-group1.css" -> group(sourceDirectory.value  ** "*.css"),
  "style-group2.css" -> group(baseDirectory.value  ** "*.css"),
  "style-group3.css" -> group((sourceDirectory in Assets).value  ** "*.css"),
  "style-group4.css" -> group(target.value  ** "*.css"),
  "style-group5.css" -> group(Seq("core.css", "styles/core.css", "assets/styles/core.css", "app/assets/styles/core.css")),
  "style-group6.css" -> group(Seq("lessStyle.css", "ui/lessStyle.css", "styles/ui/lessStyle.css", "assets/styles/ui/lessStyle.css", "app/assets/styles/ui/lessStyle.css")),
  "style-group7.css" -> group(Seq("sassStyle.css", "ui/sassStyle.css", "styles/ui/sassStyle.css", "assets/styles/ui/sassStyle.css", "app/assets/styles/ui/sassStyle.css")),
  "style-group8.css" -> group(Seq("**/*.css"))
)
Run Code Online (Sandbox Code Playgroud)

我跑; clean; reload; stageactivator测试.我将资产源文件复制到target文件夹中,声明的包的结果如下:

  • style-group1.css不存在
  • 风格group2.css包含的内容button.csscore.css
  • 风格group3.css包含的内容core.cssbutton.css
  • style-group4.css不存在
  • style-group5.css只包含的内容core.css
  • style-group6.css只包含已编译的内容lessStyle.scss
  • style-group7.css只包含已编译的内容sassStyle.scss
  • style-group8.css不存在

我不明白为什么第二和第三种情况都没有拿起预处理器生成的css文件,但是经过量身定制的第6和第7种情况确实如此.也许值得注意的是,myPipelineTask显示PathMapping所有源文件的结果,以及来自cssSass和Less任务的派生和源图.

acj*_*jay 3

根据 Typesafe 支持,我的麻烦根源在于 sbt-concat 实现其PathFinder逻辑的方式是仅拾取与源目录中文件名逐字相同的资产。相对文件名序列适用于目标目录中的文件,但没有模式匹配。这是相当不幸的。

有效的方法是通过在源目录上Seq使用 a 来构建编译后存在的输出文件。PathFinder因此,对于 .scss 文件,类似于:

Concat.groups := {
  // Determine the output names of the style files to bundle
  // This is really roundabout because sbt-concat only offers 2 ways of
  // specifying files, relative paths and using a PathFinder, and the
  // latter approach restricts itself to source files instead of output files.
  val sourceDir = (sourceDirectory in Assets).value
  val scssFiles = (sourceDir ** "*.scss").getPaths
  val scssRelativePaths = scssFiles.map(_.stripPrefix(sourceDir.getPath).stripPrefix("/"))
  val outputRelativePaths = scssRelativePaths.map(_.stripSuffix(".scss") + ".min.css")
  Seq("bundle.min.css" -> group(outputRelativePaths))
}
Run Code Online (Sandbox Code Playgroud)

附带说明一下,sbt-concat 的另一个怪癖是它不会将新文件放在自己的目录中web-assets:assetsTarget以将它们与其他管道阶段的工件分开。这Concat.parentDir也是不必要的,因为您可以直接将放置在该变量中的任何内容作为包文件名的前缀。