Как прикрепить пользовательское задание для выполнения перед тестовым заданием в 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
в конце. Без него можно было бы ссылаться на функцию без ее вызова.