在我的SBT(0.13.16)版本中,我有以下任务:
startThing := {
var bin_path = s"${file(".").getAbsolutePath}/bin"
val result = s"$bin_path/start_thing".!
if (result != 0)
throw new RuntimeException("Could not start Thing..")
true
}
start_thing
包含:
(run_subprocess &)
我的构建挂起。
我可以看到start_thing
退出(流程表没有将其作为条目),但在任务中添加一些println
表明它卡在val result = s"$bin_path/start_thing".!
上。
如果我终止run_subprocess
进程,则SBT解锁并正常运行。
在这种特殊情况下,run_subprocess
设置了一些需要在那里进行的Kubernetes端口转发,以便后续测试能够正常工作。
答案 0 :(得分:3)
尝试daemonising后台流程
(run_subprocess >/dev/null 2>&1 &)
问题可以从run_subprocess
输出,仍然按照建议的here转到父级。
我能够在sbt 0.13.17和1.0.2中复制这个问题。 Daemonising在两者中都有效。
答案 1 :(得分:0)
不管我如何评论,就我而言,挂起的原因实际上是可能打开了STDOUT,STDERR在由脚本启动的守护程序中处理,这是可以的:
/usr/local/bin/minio server "$minio_data_dir" > /dev/null 2>&1 & # and start the server
不好,
/usr/local/bin/minio server "$minio_data_dir" 2>&1 & # and start the server
所以挂起是随机发生的,即使接受的答案也从后台开始... 因此,该解决方案不需要任何包装bash脚本...这就是build.sbt
中代码的外观lazy val startLocalS3 = inputKey[Unit]("localS3")
lazy val startLocalS3Task = TaskKey[Unit]("localS3", "create local s3")
lazy val core: Project = project
.in(file("."))
.settings(
name := "rfco-core",
startLocalS3Task := {
val cmd: Seq[String] = Seq("bash" , "-c" , "./CI/start-s3-svr.sh")
import sys.process._
cmd.mkString(" ").!!
},
fork in startLocalS3Task := true,
compile.in(Compile) := (compile in Compile).dependsOn((startLocalS3Task)).value
// you might want to use Test scope ^^ here
)