如何退出sbt任务?

5 浏览
0 Comments

如何退出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)
    ...
  }
}

0
0 Comments

如何退出一个 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)。

0