如何使scalatra编译任务依赖于sbt中的scala.js packageJS任务?

时间:2014-04-11 21:38:20

标签: sbt scalatra scala.js

我有一个scalatra项目,我希望在其中提供从scala.js项目生成的JavaScript。

我有一个多项目sbt构建,允许我成功构建这两个项目。 也就是说,我可以在scalatra项目中使用编译(和运行)任务;我可以在scala.js项目中使用packageJS任务。

但是,我非常希望能够让scalatra编译任务依赖于scala.js packageJS任务;因此,在编译Scalatra项目时,会在Scala.js项目中自动生成Javascript。

在我的多项目build.sbt文件中,我尝试过:

lazy val wwwjs = project // Scala.js project

lazy val www = project // Scalatra project
  .dependsOn(wwwjs % "compile->packageJS")

但是在编译Scalatra项目时,由于“未在wwwjs中找到配置#wwwjs_2.10; 0.1:'packageJS'而失败了。需要从www#www_2.10; 0.1 compile”。

我对sbt(以及Scalatra和Scala.js)相当新鲜 - 有人可以告诉我如何做到这一点吗?

谢谢:)

1 个答案:

答案 0 :(得分:3)

这里你想要的不是项目(项目的dependsOn之间),而是tasks之间的依赖关系。

我不熟悉Scalatra,但是对于sbt方面它应该与Play非常相似,并且我们在这里使用Scala.js有一个成功的Play项目模板: https://github.com/vmunier/play-with-scalajs-example/blob/master/project/Build.scala

特别是,我从上面的构建中推导出以下基本的改编:

import scala.scalajs.sbtplugin.ScalaJSPlugin._ // if Build.scala
import ScalaJSKeys._

lazy val wwwjs = project // Scala.js project

lazy val www = project // Scalatra project
  .settings(
    compile in Compile <<= (compile in Compile) dependsOn (fastOptJS in (wwwjs, Compile))
  )

或者,对于完全优化的版本,使用fullOptJS而不是fastOptJS(但每次进行更改时都需要几秒钟才能重建)。