问题是如果test in Test <<= (taskA, taskB) { (A, B) => A doFinally B
或test in Test := (taskB dependsOn taskA).value
和taskA
forked
为taskB
,则sbt执行不会继续doFinally/dependsOn
并获取& #39;无限期地被卡住了。它是由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
}
)
引起的,因为它们可能使它成为单线程顺序执行。但我无法找到任何其他方式来订购这两项任务,使它们按顺序运行。
到目前为止,我已经走到了这一步:
startServer
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
}
的情况下强制执行它。
{{1}}
我想我必须尝试sbt-sequential或分叉新流程。
答案 0 :(得分:1)
我可以建议更简单的解决方法,而不是处理SBT。使用静态方法创建类以启动服务器(它将检查服务器是否尚未启动),并在每个测试中显式启动此服务器。您需要设置&#34; fork in Test:= true&#34;,在单独的JVM中运行服务器并在测试完成后关闭它。
我使用这种方法启动嵌入式Cassandra服务器进行集成测试
就我的情况而言,它是使用Java的静态方法,您可以使用Scala和伴随对象执行相同的操作。
override def beforeAll() {
log.info(s"Start Embedded Cassandra Server")
EmbeddedCassandraServerHelper.startEmbeddedCassandra("/timeseries.yaml")
}
和
public static void startEmbeddedCassandra(String yamlFile, String tmpDir) throws TTransportException, IOException, ConfigurationException {
if (cassandraDaemon != null) {
/* nothing to do Cassandra is already started */
return;
}
// ... Start new server
}
答案 1 :(得分:1)
由于某些原因,这些设置都不会产生新的过程:
fork := true
fork in runMain := true
fork in Test := true
fork in (Test, runMain) := true
这就是顺序dependsOn/doFinally
阻塞的原因,因为进程没有分叉...
我尝试使用revolver完全相同,但它确实有效。我向所有试图在sbt中分叉进程的人推荐左轮手枪,因为至少从这种体验中不能依赖sbt的fork
。
lazy val startServer = taskKey[Unit]("Start PingPong Server before running JS tests")
lazy val jvm =
project.in(file("jvm"))
mainClass in Revolver.reStart := Option("com.example.PingPong"),
startServer := {
(Revolver.reStart in Test).toTask("").value
}
)
lazy val js =
project.in(file("js"))
test in Test := (test in(Test, fastOptStage)).dependsOn(startServer in Project("jvm", file("jvm"))).value
)