Playframework Closure Compiler以错误的顺序连接javascript

时间:2014-03-06 16:00:38

标签: scala playframework-2.0 sbt google-closure-compiler playframework-2.2

我有几个遗留在app / assets / javascripts

的Javascript文件

运行游戏时我只包含生成的文件:'main.min.js',我可以看到所有资产连接和缩小。

我在不同的Javascript文件中的元素之间存在一些依赖关系,因此它们必须以某种方式连接。

我尝试给他们前缀0_file.js .. 99_file.js,并确保在使用Google copmiler.jar --js 0_file.js ..--js 99_file.js时确实保留了订单。

然后我转移到我发现默认行为的Play documentation

javascriptEntryPoints <<= (sourceDirectory in Compile)(base =>
   ((base / "assets" ** "*.js") --- (base / "assets" ** "_*")).get
)

我不是Scala专家,但我希望这个默认的文件提取不会像我想的那样对它们进行排序 - 因此可以通过修复此源提取来保存它们的顺序来解决问题。

如何更改此处的代码以按字母顺序获取文件。

或者 - 如何在将文件发送到Closure Compiler之前控制文件的顺序。

修改

我刚刚意识到我正在使用的Play版本(2.2.1)中删除了Build.scala所以我也想知道我应该在哪里添加javascriptEntryPoints Seq以及它与 在build.sbt文件中播放.Project.playScalaSettings。

2 个答案:

答案 0 :(得分:2)

我们可以订购从路径查找器返回的文件列表的一种方法就是对它们进行排序。像这样的东西

 val sortFiles:Seq[File] => Seq[File]  = files => files.sortWith(_.getName < _.getName)

 javascriptEntryPoints <<= (sourceDirectory in Compile)(base =>
      sortFiles(((base / "assets" ** "*.js") --- (base / "assets" ** "_*")).get)
 )

这里sortFiles使用seq文件并使用sortWith方法对它们进行排序。 sortWith方法使用两个文件调用传入的函数。在这个例子中,我使用getName并使用字符串比较对它们进行排序。

答案 1 :(得分:0)

将其添加到Build.scala的底部进行测试

val base = new File("./app/")
val list = ((base / "assets" ** "*.js") --- (base / "assets" ** "_*")).get.sortBy(_.name)
list.foreach(println)

在sbt控制台中运行reload来触发代码,根据需要调整base和sortBy,或者使用任何其他集合方法来操作结果。您还可以在构建期间通过添加.map{ f => println(f);f}

来记录此内容

对我来说这打印了以下内容,即使没有排序......

./app/assets/javascripts/jquery.smartbanner.js
./app/assets/javascripts/main.js
./app/assets/javascripts/search.js
./app/assets/javascripts/searchBox.js