Как разветвить процесс с помощью fullRunTask в sbt?

#sbt

#sbt

Вопрос:

Я пишу плагин sbt, который запускает сервер из sbt.

 lazy val kstart = taskKey[Unit]("Start scala kata")
lazy val Backend = config("backend")
Seq(
  fullRunTask(kstart, Backend, "com.scalakata.backend.Boot", "..."),
  fork in kstart := true,
  connectInput in kstart := false
)
  

Проблема в том, что после запуска сервера у меня нет приглашения sbt.

 > kstart
[info] Running com.scalakata.backend.Boot _
// no prompt here :(
  

Похоже, что процесс не разветвлялся или что-то в этом роде.

Комментарии:

1. Я думаю, что вы запускаете свой сервер в отдельной JVM, проблема, с которой вы сталкиваетесь, заключается в том, что sbt будет ждать завершения процесса, прежде чем позволить вам ввести что-либо еще. Смотрите соответствующую часть кода на GitHub

2. да, вы правы, можете ли вы добавить свой комментарий в качестве ответа? пример из sbt-revolver

Ответ №1:

Вы запускаете свой сервер в отдельной JVM, проблема, с которой вы сталкиваетесь, заключается в том, что sbt будет ждать завершения процесса, прежде чем разрешить вам вводить что-либо еще.

Смотрите соответствующую часть кода на GitHub.

 // fork with Java because Scala introduces an extra class loader (#702)
val process = Fork.java.fork(configLogged, scalaOptions)
def cancel() = {
  log.warn("Run canceled.")
  process.destroy()
  1
}
val exitCode = try process.exitValue() catch { case e: InterruptedException => cancel() }
  

Вызов process.exitValue() будет блокироваться до тех пор, пока процесс не будет существовать.

Я думаю, вам придется самостоятельно управлять процессом, если вы хотите, чтобы он выполнялся в фоновом режиме.