6

(サンプル プロジェクトが提供されています) 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.cssbutton.cssにはとの内容が含まれていますcore.css
  • style-group3.csscore.cssにはとの内容が含まれていますbutton.css
  • style-group4.cssが存在しません
  • style-group5.cssには、core.css
  • style-group6.cssには、コンパイル済みのコンテンツのみが含まれていますlessStyle.scss
  • style-group7.cssには、コンパイル済みのコンテンツのみが含まれていますsassStyle.scss
  • style-group8.cssが存在しません

css2 番目と 3 番目のケースではプリプロセッサによって生成されたファイルが取得されないのに、オーダーメイドの 6 番目と 7 番目のケースでは取得される理由がわかりません。おそらく注目に値するのは、すべてのソース ファイルの show s の結果と、Sass および Less タスクからの派生myPipelineTaskおよびソースマップです。PathMappingcss

4

1 に答える 1

3

Typesafe サポートによると、私の問題の原因は、sbt-concatPathFinderが、ソース ディレクトリと同じファイル名のアセットのみをピックアップするような方法でロジックを実装しているという事実です。相対ファイル名のシーケンスは、ターゲット ディレクトリ内のファイルに対して機能しますが、パターン マッチングはありません。これはかなり残念です。

機能するのは、ソース ディレクトリで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))
}

web-assets:assetsTarget補足として、sbt-concat のもう 1 つの癖は、新しいファイルを他のパイプライン ステージのアーティファクトから分離するために独自のディレクトリに配置しないことです。Concat.parentDirバンドルファイル名のプレフィックスとしてその変数に直接配置するものは何でもできるため、これも不要です。

于 2015-02-21T02:55:11.533 に答える