SBT deja de correr sin salir

120

¿Cómo se termina una carrera en SBT sin salir?

Estoy probando CTRL + C pero sale de SBT. ¿Hay alguna manera de salir solo de la aplicación en ejecución mientras se mantiene abierto SBT?

dsg
fuente
Ctrl+DNo funciona.
botchniaque
Creo que Ctrl + Dfunciona solo para el marco de Play.
EnverOsmanov

Respuestas:

44

En la configuración predeterminada, sus ejecuciones ocurren en la misma JVM que sbt está ejecutando, por lo que no puede eliminarlas fácilmente por separado.

Si ejecuta su ejecución en una JVM separada y bifurcada, como se describe en Forking , puede eliminar esa JVM (por cualquier medio que ofrezca su sistema operativo) sin afectar la JVM de sbt:

fork in run := true
Seth Tisue
fuente
9
Estoy intentando hacer esto. Específicamente, he implementado: stackoverflow.com/questions/3868863/… pero sbt todavía se cierra cuando hago CTRL + C. ¿Cómo mato solo la JVM bifurcada?
dsg
2
con killdesde la línea de comando, o en el Administrador de tareas (Windows), o Forzar salida o Monitor de actividad (Mac OS X), etc.
Seth Tisue
Después de bifurcar, para matar todo java excepto sbt, ejecute:kill -9 `ps -h | grep java | grep -v sbt-launch | grep -v grep | awk '{print $1}'`
dsg
1
Me encanta esta idea, pero no parece ayudar. Estoy corriendo SBT 0.13.1 y añadiendo esta línea en mi archivo build.sbt ..
doub1ejack
tienes que matar runcon CTRL + D
Timofey
82

Desde sbt versión 0.13.5 puede agregar a su build.sbt

cancelable in Global := true

Se define como "Habilita (verdadero) o deshabilita (falso) la capacidad de interrumpir la ejecución de tareas con CTRL + C". en la definición de claves

Si está utilizando Scala 2.12.7+, también puede cancelar la compilación con CTRL + C. Referencia https://github.com/scala/scala/pull/6479

Se informaron algunos errores:

Jonas Anso
fuente
5

He encontrado lo siguiente útil cuando tengo control sobre el bucle principal de la aplicación que se ejecuta desde sbt.

Le digo a sbt que se bifurque cuando se ejecuta la aplicación (en build.sbt):

fork in run := true

También le digo a sbt que reenvíe stdin desde el shell de sbt a la aplicación (en build.sbt):

connectInput in run := true

Finalmente, en el hilo principal de la aplicación, espero el final del archivo en stdin y luego apago la JVM:

while (System.in.read() != -1) {}
logger.warn("Received end-of-file on stdin. Exiting")
// optional shutdown code here
System.exit(0)

Por supuesto, puede usar cualquier hilo para leer stdin y apagar, no solo el hilo principal.

Finalmente, inicie sbt, opcionalmente cambie al subproyecto que desea ejecutar, ejecute.

Ahora, cuando desee detener el proceso, cierre su stdin escribiendo CTRL-D en el shell sbt.

kilo
fuente
1

Considere usar sbt-revolver . Lo usamos en nuestra empresa y es muy útil. Porque lo que estás pidiendo se puede hacer con:

reStart

reStop

Sin necesidad de configurar el archivo build.sbt.

Puedes usar este complemento agregando:

addSbtPlugin("io.spray" % "sbt-revolver" % "0.9.1")

A su proyecto / plugins.sbt

mtsokol
fuente