【问题标题】:Cannot get sbt-concat to bundle styles from sbt-sass or sbt-less无法让 sbt-concat 从 sbt-sass 或 sbt-less 捆绑样式
【发布时间】:2015-02-14 10:56:30
【问题描述】:

(提供的示例项目)我无法让sbt-concat 按设计工作以查找和连接由预处理器任务生成的样式产生的样式表。在我的生产应用程序中,我试图用它来捆绑从sbt-sass 中选择的缩小输出文件。它在该项目的复杂设置中不起作用,所以我创建了一个示例项目,看看我是否可以让它工作。它在示例项目中也不起作用。这是一个测试项目build.sbt,它尝试创建几个捆绑包,几乎有我能想到的所有可能性,只是为了看看它们中的任何一个是否有效(public 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"))
)

我从activator 运行; clean; reload; stage 进行测试。我看到资产源文件被复制到 target 文件夹中,声明的捆绑包具有以下结果:

  • style-group1.css 不存在
  • style-group2.css 包含button.csscore.css 的内容
  • style-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 不存在

我不明白为什么第 2 和第 3 种情况不拾取预处理器生成的 css 文件,而定制的第 6 和第 7 种情况却可以。也许值得注意的是,myPipelineTask 的结果显示了所有源文件的PathMappings,以及来自 Sass 和 Less 任务的派生 css 和源映射。

【问题讨论】:

  • 在运行stage 时查看它是否按预期工作。然后尝试添加一行pipelineStages in Assets := Seq(concat)(除了现有的)。
  • @Mikesname 所以它适用于此,但不能解决最终问题。它没有从sbt-sass 获取文件结果。我在使用sbt-sasssbt-less 时复制了这种行为。编辑问题..

标签: scala playframework-2.0 sbt-web sbt-concat


【解决方案1】:

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

起作用的是通过在源目录上使用PathFinder 来构建将在编译后存在的输出文件的Seq。所以对于 .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))
}

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

【讨论】:

  • 像魅力一样工作!请注意,在 Windows 机器上,除了 / 之外,您还必须使用 stripPrefix("\\") 而不是 stripPrefix("/")
猜你喜欢
  • 1970-01-01
  • 2013-08-28
  • 2021-10-04
  • 2014-07-12
  • 2019-08-23
  • 2015-06-02
  • 2012-10-07
  • 1970-01-01
  • 2015-06-19
相关资源
最近更新 更多