Невозможно получить sbt-concat для объединения стилей из sbt-sass или sbt-less

( Приведен пример проекта) Я не могу заставить sbt-concat работать так, как он предназначен для поиска и объединения таблиц стилей, полученных в результате стилей, которые могут быть получены из задач препроцессора. В моем производственном приложении я пытаюсь использовать его для связывания выбранных минимизированных выходных файлов из sbt-sass. Он не работает в сложной настройке этого проекта, поэтому я создал пример проекта, чтобы посмотреть, смогу ли я заставить его работать вообще. Это не работает в примере проекта. Вот тестовый проект build.sbt он пытается создать несколько пакетов, с практически каждой возможностью, о которой я только могу подумать, просто чтобы посмотреть, работает ли какой-либо из них ( общедоступное Github-репо, которое вы должны быть в состоянии клонировать и немедленно воспроизвести проблему):

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"))
)

я бегу ; clean; reload; stage от activator тестировать. Я вижу исходные файлы активов, скопированные в target папка, со следующими результатами для заявленных комплектов:

  • style-group1.css не существует
  • style-group2.css содержит содержимое button.css а также core.css
  • style-group3.css содержит содержимое core.css а также button.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 шоу PathMapping s для всех исходных файлов, а также производных css и исходные карты из задач Sass и Less.

1 ответ

Решение

Согласно поддержке Typesafe, источником моих проблем является тот факт, что sbt-concat реализует его PathFinder логика таким образом, чтобы подобрать только те активы, которые дословно имеют то же имя файла, что и в исходном каталоге. Последовательность относительных имен файлов работает для файлов в целевом каталоге, но не соответствует шаблону. Это довольно неудачно.

Что работает, чтобы построить Seq выходных файлов, которые будут существовать после компиляции с использованием 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))
}

В качестве примечания, еще одна особенность sbt-concat заключается в том, что он не помещает свои новые файлы в свой собственный каталог в web-assets:assetsTarget отделить их от артефактов других этапов трубопровода. Concat.parentDir Это также не нужно, потому что вы можете просто добавить в эту переменную префикс для имени вашего файла пакета напрямую.

Другие вопросы по тегам