如何退出sbt任务?
如何退出sbt任务?
运行一个sbt任务。正常情况下,任务完成后,应该停止在终端上。但终端没有等待下一条输入,这意味着我的任务一直在运行。我猜想在任务启动后,某些被调用的线程没有退出。
如何干净地退出并结束所有由sbt任务启动的进程?
我可以调试哪个服务没有停止,但这需要很长时间才能弄清楚。
更多细节
在build.sbt中
lazy val refreshTranslations = taskKey[Unit]("blabla") fullRunTask(refreshTranslations, Compile, "tasks.TranslationTask")
在任务中
object TranslationTask { def main(args: Array[String]): Unit = { // 使用ActorSystem(),AhcWSClient()进行后台操作 Await.result(service.get, 20.seconds) ... } }
如何退出一个 sbt 任务?
问题的出现的原因:通过查看代码,可以发现在 sbt 的任务中启动了一个 ActorSystem,并且在任务完成后需要退出这个 ActorSystem。然而,直接调用 `scala.sys.exit()` 方法并不能完全退出整个 sbt 任务,因此需要寻找其他解决方法。
解决方法:在 build.sbt 文件中,可以在不同的线程中启动任务。具体做法是通过在 `lazy val` 中设置 `fork` 的值为 `true`,然后使用 `fullRunTask` 方法来启动任务。同时,在任务的代码中使用 `scala.sys.exit()` 来退出任务。
具体代码如下:
lazy val refreshTranslationsFallback = taskKey[Unit]("Refresh the translations file fallback") fullRunTask(refreshTranslationsFallback, Compile, "tasks.TranslationTask") fork in refreshTranslationsFallback := true object TranslationTask { def main(args: Array[String]): Unit = { // background stuff with ActorSystem() , AhcWSClient() ... scala.sys.exit() // important } }
以上解决方法参考了 StackOverflow 上的一个帖子:[SBT stop run without exiting](https://stackoverflow.com/questions/5137460)。