Как сделать задачу компиляции scalatra зависимой от задачи scala.js packageJS в sbt?
Вопрос
У меня есть проект scalatra, в котором я хочу использовать JavaScript, созданный на основе проекта scala.js.
У меня есть многопроектная сборка sbt, которая позволяет мне успешно построить оба этих проекта.То есть я могу использовать задачи компиляции (и запуска) в проекте scalatra;и я могу использовать задачу packageJS в проекте scala.js.
Однако мне бы очень хотелось, чтобы задача компиляции scalatra зависела от задачи scala.js packageJS;поэтому, когда проект Scalatra компилируется, Javascript автоматически генерируется в проекте Scala.js.
В моем многопроектном файле 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:«пакетJS».Это требовалось при компиляции www#www_2.10;0.1".
Я новичок в sbt (а также в Scalatra и Scala.js!) — может ли кто-нибудь просветить меня, как это сделать?
Спасибо :)
Решение
Здесь вам нужна не зависимость между проекты (который является то, что dependsOn
в проекте есть), но между tasks
.
Я не знаком со Scalatra, но с точки зрения sbt она должна быть очень похожа на Play, и у нас есть успешный шаблон для проектов Play с Scala.js здесь: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
для полностью оптимизированной версии (но каждый раз, когда вы вносите изменения, перестройка занимает несколько секунд).