Как прикрепить пользовательское задание для выполнения перед тестовым заданием в 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)

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

ОБНОВИТЬ

После изменений, предложенных @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

3 ответа

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
}

См. Задачи в официальной документации SBT для более подробной информации.

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

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

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
  }

[РЕДАКТИРОВАТЬ] Вы должны определить зависимости задачи в настройках проекта. Для "нормального" проекта вы должны сделать это следующим образом:

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

Для меня использую dependsOnсинтаксис не работал. Вместо этого я использовал ИСПЫТАНИЯ функциональные настройки из sbt.

В вашем примере это будет примерно так:

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

testJsTask := {
  // ...whatever logic
}

// then inside your project settings
Test / testOptions += Tests.Setup(() => testJsTask.value)

Обратите внимание на .valueв конце. Без него можно было бы ссылаться на функцию без ее вызова.

Другие вопросы по тегам