问题是如果我做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