Как подключить настраиваемую задачу для выполнения перед тестовой задачей в sbt?

Я использую SBT с Play Framework.

Я создал пользовательский TaskKey для запуска тестов JavaScript в моем проекте:

import sbt._
import sbt.Process._
import PlayProject._

object ApplicationBuild extends Build {

  val testJsTask = TaskKey[Unit]("testJs", "Run javascript tests.") := {}

  val main = PlayProject("xxx", 1.0, Seq())
    .settings(defaultScalaSettings: _*)
    .settings(testJsTask)
}

Пока все хорошо.

Я хочу запускать этот testJsTask всегда, когда кто-то выполняет задачу test.

Я предполагаю, что это должно быть что-то следующим образом:

test in Test <<= (test in Test).dependsOn(testJsTask)

Я не знаю, как его точно определить. Как добавить зависимость к существующей задаче типа "test" или "build"?

UPDATE

После изменений, предложенных @Christian, определение сборки выглядит следующим образом:

object ApplicationBuild extends Build {
  val testJsTask = TaskKey[Unit]("testJs", "Run tests for javascript client.")
  def testJs = {}

  val main = PlayProject("xxx", 1.0, Seq())
    .settings(defaultScalaSettings: _*)
    .settings(testJsTask := testJs)

  (test in Test) <<= (test in Test) dependsOn (testJs)
}

К сожалению, решение не работает:

[error] /xxx/project/Build.scala:21: not found: value test
[error]   (test in Test) <<= (test in Test) dependsOn (testJs)
[error]    ^
[error] one error found
[error] {file:/xxx/project/}default-f468ae/compile:compile: Compilation failed

Ответ 1

Это один из способов сделать это:

Определите ключ задачи:

val testJsTask = TaskKey[Unit]("testJs", "Run javascript tests.")    

Определите задачу в настройках ваших проектов:

testJsTask <<= testJs

Зависит от теста:

(test in Test) <<= (test in Test) dependsOn (testJs)

testJs можно определить следующим образом:

  def testJs = (streams) map { (s) => {
    s.log.info("Executing task testJs")
    // Your implementation
  }

[EDIT] Вы должны определить зависимости задачи в настройках проектов. Для "нормальный" проект, вы сделали бы это следующим образом:

  lazy val testProject = Project(
    "testProject",
    file("testProject"),
    settings = defaultSettings ++ Seq(
      testJsTask <<= testJs,
      (test in Test) <<= (test in Test) dependsOn (testJsTask)
    )
  )

Ответ 2

Play 2.2.x использует SBT 0.13 (см. Что нового в Play 2.2). Это приводит к появлению новых способов составления задач в build.sbt (без использования файла Scala в подкаталоге project/).

Если вы используете Play 2.2.x, вы можете определить зависимость между задачами в build.sbt следующим образом:

lazy val testJsTask = taskKey[Unit]("Run JavaScript tests.")

testJsTask := {
  println("Running JavaScript tests...")
  java.util.concurrent.TimeUnit.SECONDS.sleep(3)
  println("...done.")
}

test in Test := {
  testJsTask.value
  (test in Test).value
}

Подробнее см. Tasks в официальной документации SBT.