【问题标题】:How to exit a sbt task?如何退出 sbt 任务?
【发布时间】:2017-05-23 03:05:08
【问题描述】:

我运行一个 sbt 任务。完成后的正常情况,它应该在终端停止。但是终端没有等待下一个输入意思:我的任务一直在运行。我假设一些被调用的线程在任务启动后没有退出。

如何退出 clean 并杀死 sbt 任务启动的所有进程? 我可以调试哪个服务没有停止,但需要很长时间才能弄清楚。

更多细节

在 build.sbt 中

lazy val refreshTranslations = taskKey[Unit]("blabla")
fullRunTask(refreshTranslations, Compile, "tasks.TranslationTask")

在任务中

object TranslationTask {

  def main(args: Array[String]): Unit = {
    // background stuff with ActorSystem() , AhcWSClient()
    Await.result(service.get, 20.seconds)
    ...
  }
}

【问题讨论】:

  • 你在终端试过crtl + d吗
  • 我知道如何使用 cmd + C 在终端中退出。我在 SBT 中专门询问。
  • 您的任务正在运行外部定义的函数?为什么不定义它并将其作为常规任务运行?
  • 这个和这个有关系吗:stackoverflow.com/a/24600377/1553233
  • akka ActorSystem 使用非守护线程。在 JVM 退出之前,您需要在 ActorSystem 上调用 terminate。在 sbt 中,您可能希望在 shutdown hook 中使用它。

标签: scala sbt task actor


【解决方案1】:

我找到了在 SBT 任务完成后退出 ActorSystem 的方法。

在 build.sbt 中,在不同的线程中启动任务。

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
  }
}

特别感谢SBT stop run without exiting

【讨论】:

    猜你喜欢
    • 2020-04-05
    • 2020-11-29
    • 1970-01-01
    • 2016-11-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多