2011-12-18 4 views
18

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

Я создал пользовательский 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 
+0

Вы успешно? Помогло ли вам мое последнее редактирование? – Christian

+0

Unlucky Я не вижу способа сделать то же самое с Play-версией:/Я попробую сделать еще несколько тестов, и я сообщу здесь, если будут какие-то успехи. –

+0

Мне интересно узнать, нашли ли вы разрешение. – 2rs2ts

ответ

14

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

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

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) 
    ) 
) 
+1

Как-то это выглядит неправильно для меня неполным. То, что я хочу сделать, - убедиться, что когда кто-то запустит команду «test», то, кроме всего остального теста, он выполнит также testJs. Также я вижу, что вы вообще не использовали символ «: =», который, как мне известно, необходим при создании задач - или я ошибаюсь? EDIT: я вижу ваше редактирование, теперь он начинает иметь больше смысла, я попробую сразу;) –

+1

Вы можете напрямую определить задачу с помощью: =. Я предпочитаю другую возможность, потому что тогда я могу отделить ключи задачи от реальных задач. – Christian

+0

У меня до сих пор такая же проблема, как и раньше: Build.scala: 19: not found: value test. [ошибка] (тест в тесте) << = (тест в тесте) dependsOn (testJsTask) –

10

Play 2.2.x использует SBT 0,13 (см What’s new in 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 для более подробной информации.

+1

Выполняет ли это запуск задачи последовательно или одновременно? – monkjack

+0

Последовательно. Сначала testJsTask, затем тестовую задачу. – htomek

+1

Насколько я понимаю, это неверно @htomek http://www.scala-sbt.org/release/docs/Custom-Settings.html#Execution+semantics+of+tasks Использовать 'Def.sequential()' для запуска задач в порядке http://www.scala-sbt.org/release/docs/Howto-Sequision.html – trudolf

Смежные вопросы