我有一个使用 Play Framework 2.3 的项目,并且在整个资产管道中处理 JS 文件的方式存在一些问题。我想根据应用程序是在开发模式还是生产模式下启动以不同方式处理我的 JS 源文件。具体来说,我不想在开发模式下运行管道阶段transpile,watch而是在阶段transpile和uglify生产模式下运行。
我已经设置了全局管道阶段,pipelineStages := Seq(transpile, uglify)并且这仅在生产模式下运行,正如预期的那样。
现在,对于开发模式,我已经将其设置为pipelineStages in Assets := Seq(transpile, watch)适用于开发,但我的问题是它也以生产模式运行。该watch需求仅在开发模式下运行。
我没能找到很多关于这方面的好信息,Play 文档甚至没有提到pipelineStages in Assets,而sbt-web自述文件只是顺便提到了它。除此之外,我只找到了一堆博客文章。从我读到的内容来看,我的印象pipelineStages in Assets是开发模式独有的,但这种假设显然是不正确的。
我知道这playRunHooks对于开发人员专有的东西意味着什么,但我不能使用它,因为它在配置完成后运行,因此不能用于有条件地配置管道阶段。对于这个问题
,我目前非常丑陋的解决方法是,我在其中设置了一个系统属性,playRunHooks并在watch管道阶段周围有一个包装器,用于在调用该属性时检查该属性。
那么是否有任何正确的方法可以为我的 sbt-web 构建指定“仅开发”管道阶段?任何建议,将不胜感激。
(我们也在迁移到 Play Framework 2.6,以防它给我更多的可能性)
我正在使用Sass作为我的CSS preprocesser,我正试图让它通过资产管道运行.我已经尝试将这个sassTask实现为源文件任务和Web资产任务,但我遇到了两个方面的问题.
如果我将Sass作为源任务运行(见下文),它会在activator run请求页面时触发,并在页面重新加载时找到更新的文件.我遇到的问题是生成的CSS文件都被直接转储target/web/public/main/lib到子目录中,而不是反映在它们内置到resources-managed目录下的子目录中.我无法弄清楚如何实现这一目标.
相反,我尝试将Sass编译实现为Web资产任务(见下文).据我所知,以这种方式工作resources-managed并没有发挥作用,所以我将我的文件直接编译成target/web/public/main/lib.我确定我没有足够动态地做这件事,但我不知道怎么做得更好.但这里最大的问题是管道在完成工作时显然不会运行activator run.我可以让它运行使用activator stage,但我真的需要它在常规开发工作流程中工作,以便我可以在开发服务器运行时更改样式文件,与Scala文件相同.
我试过梳理这些论坛,通过sbt-web文档,以及一些现有的插件,但我发现这个过程非常令人沮丧,因为SBT的复杂性和实际发生的事情的不透明性.构建过程.
Sass编译作为源文件任务:
lazy val sassTask = TaskKey[Seq[java.io.File]]("sassTask", "Compiles Sass files")
sassTask := {
import sys.process._
val x = (WebKeys.nodeModules in Assets).value
val sourceDir = (sourceDirectory in Assets).value
val targetDir = (resourceManaged in Assets).value
Seq("sass", "-I", "target/web/web-modules/main/webjars/lib/susy/sass", "--update", s"$sourceDir:$targetDir").!
val sources = sourceDir ** "*.scss"
val mappings = sources pair relativeTo(sourceDir)
val renamed = mappings map { case (file, path) …Run Code Online (Sandbox Code Playgroud) 这是我目前为Play 2.2.x requireJS设置的.它会在2.3之后继续工作吗?我在2.3文档中的任何地方都找不到requireJs或requireJsShim.
requireJs ++= Seq("mainAccount.js", "mainOrg.js", "mainPublic.js"), // This tells Play to optimize this file and its dependencies
requireJsShim += "build.js", // This tells Play to read the RequireJS "shim" configuration from build.js
requireJsFolder := "js"
Run Code Online (Sandbox Code Playgroud) 我不太熟悉sbt/play配置.我正在使用play 2.3.8来提供我的javascript应用程序.在该项目中有:
.enablePlugins(SbtWeb)
.enablePlugins(play.PlayScala)
.settings(
...
libraryDependencies ++= WebDependancies :+ evobufAkka,
pipelineStages in Assets := Seq(closure, digest),
...
// Some closure compiler settings
)
Run Code Online (Sandbox Code Playgroud)
该项目使用闭包编译器来缩小代码等.但我想改变它.我想停止使用闭包编译器,而只是使用简单的npm包.我知道sbt可以运行一些shell任务.所有这一切的原因是将服务器与前端分开,因此所有与前端相关的任务(较少,uglify,指纹识别等)实际上都是由类似节点的javascript工具完成的.我正在阅读关于sbt-web但我想尽可能避免这种情况.我想到的是:1.启动sbt,打开我的项目2.运行编译: - sbt将运行我的npm任务,最终得到一些build.js文件,然后可以通过/ public目录中的play框架或其他任何方式提供.3.如果可能的话,我希望有一个单独的单元测试过程.
在npm设置方面,我考虑将package.json放在我的project/public文件夹中,除非把它放在更好的位置project/app/assets.
这一切都可能吗?
2015年8月8日更新
我做了一些研究,发现了外部过程.基于我创建的一些例子:
lazy val npmBuildTask = taskKey[Unit]("Execute the npm build command to build the ui")
npmBuildTask := {
"cd public/ && npm install" !
}
Run Code Online (Sandbox Code Playgroud)
但不确定如何将此任务添加到编译过程中?
我正在使用sbt-concat来组合css/js包进行实验.然后我尝试扩展我的管道,以便缩小我的css和js.使用sbt-css-compress相当容易,它可以缩小sbt-concat生成的所有CSS.我为js尝试了sbt-closure,但它似乎不起作用.为了清楚起见,我尝试了sbt-closure,并确认它将以下所有js编译为/ assets.但是,我试图弄清楚它是否适用于sbt-concat.
例如:如果我有/assets/js/f1.js和/assets/js/f2.js并且我想将它们组合并缩小为1个捆绑文件.