問題是如果我做test in Test <<= (taskA, taskB) { (A, B) => A doFinally B
或test in Test := (taskB dependsOn taskA).value
和taskA
是forked
,那麼執行不會繼續到taskB
並且get無限期地卡住。這是由doFinally/dependsOn
造成的,因爲它們可能使它成爲單線程順序執行。但我找不到任何其他方式來訂購這兩項任務,讓它們順序運行。如何在SBT中運行測試套件之前啓動服務器?
到目前爲止,我已經這麼遠得到:上產生一個線程,甚至是守護一個任務startServer
lazy val startServer = taskKey[Unit]("Start PingPong Server before running Scala-JS tests")
lazy val jvm =
project.in(file("jvm"))
fork in (Test, runMain) := true
startServer := {
(runMain in Test).toTask(" com.example.PingPong").value
}
)
lazy val js =
project.in(file("js"))
test in Test <<= (startServer in Project("jvm", file("jvm")), test in(Test, fastOptStage)) {
(startServer, test) => startServer doFinally test
}
)
的SBT停止執行。我試過fork in startServer := true
但它沒有幫助。
我也試過dependsOn
,但它也能阻止:
test in Test := {
(test in(Test, fastOptStage)).dependsOn(startServer in Project("jvm", file("jvm"))).value
}
如果我沒有在主類PingPong
啓動服務器,其行爲與預期相同。此外,如果我這樣做,它的工作原理,但它有一個隨機的執行順序,我不知道如何執行它沒有doFinally
。
test in Test := {
(startServer in Project("jvm", file("jvm"))).value
(test in(Test, fastOptStage)).value
}
我想我會去嘗試sbt-sequential或fork一個新的過程。
我也這樣做,我只需要啓動該服務器從通過任務SBT從各種其他原因......它只是需要被分叉的一種方式,但SBT的叉子是行不通的,左輪手槍沒有... – lisak 2014-09-10 16:06:17
也是在這種特殊情況下,你不能做你的建議,因爲'js'項目被編譯爲javascript並且在phantomJS上運行,並且jvm項目具有Java依賴項。因爲我需要測試scalaJS項目,所以我不能依賴具有Java依賴性的JVM項目,該項目不會編譯爲javascript :-)這有點麻煩 – lisak 2014-09-10 22:04:57