如何在不退出的情况下终止 SBT 中的运行?
我正在尝试 CTRL+C 但它退出了 SBT。有没有办法在保持 SBT 打开的同时只退出正在运行的应用程序?
从 sbt 版本 0.13.5 你可以添加到你的 build.sbt
cancelable in Global := true
它被定义为“启用 (true) 或禁用 (false) 使用 CTRL+C 中断任务执行的能力”。在键定义中
如果您使用的是 Scala 2.12.7+,您还可以使用 CTRL+C 取消编译。参考https://github.com/scala/scala/pull/6479
报告了一些错误:
在默认配置中,你的运行发生在 sbt 运行的同一个 JVM 中,所以你不能轻易地单独杀死它们。
如果您在一个单独的分叉 JVM 中运行,如Forking中所述,那么您可以终止该 JVM(通过您的操作系统提供的任何方式)而不影响 sbt 的 JVM:
fork in run := true
当我可以控制从 sbt 运行的应用程序的主循环时,我发现以下内容很有用。
我告诉 sbt 在运行应用程序时分叉(在 build.sbt 中):
fork in run := true
我还告诉 sbt 将标准输入从 sbt shell 转发到应用程序(在 build.sbt 中):
connectInput in run := true
最后,在应用程序的主线程中,我在标准输入上等待文件结束,然后关闭 JVM:
while (System.in.read() != -1) {}
logger.warn("Received end-of-file on stdin. Exiting")
// optional shutdown code here
System.exit(0)
当然,您可以使用任何线程来读取标准输入和关闭,而不仅仅是主线程。
最后启动sbt,可选切换到你要运行的子项目,运行。
现在,当你想停止进程时,通过在 sbt shell 中输入 CTRL-D 来关闭它的标准输入。
考虑使用sbt-revolver。我们在公司使用它,它真的很方便。对于您所要求的,可以通过以下方式完成:
reStart
reStop
无需配置 build.sbt 文件。
您可以通过添加以下内容来使用此插件:
addSbtPlugin("io.spray" % "sbt-revolver" % "0.9.1")
到你的项目/plugins.sbt