Невозможно получить 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
Это также не нужно, потому что вы можете просто добавить в эту переменную префикс для имени вашего файла пакета напрямую.