SBT arrête de fonctionner sans quitter

120

Comment terminer une exécution dans SBT sans quitter?

J'essaye CTRL + C mais ça quitte SBT. Existe-t-il un moyen de quitter uniquement l'application en cours d'exécution tout en gardant SBT ouvert?

dsg
la source
Ctrl+Dne marche pas.
botchniaque
Je pense Ctrl + Dque cela ne fonctionne que pour le framework Play.
EnverOsmanov

Réponses:

44

Dans la configuration par défaut, vos exécutions se produisent dans la même JVM que sbt, vous ne pouvez donc pas les tuer facilement séparément.

Si vous effectuez votre exécution dans une JVM séparée et fourchue, comme décrit dans Forking , vous pouvez alors tuer cette JVM (par tous les moyens proposés par votre système d'exploitation) sans affecter la JVM de sbt:

fork in run := true
Seth Tisue
la source
9
J'essaye de faire ça. Plus précisément, j'ai implémenté: stackoverflow.com/questions/3868863/… mais sbt existe toujours lorsque je fais CTRL + C. Comment supprimer uniquement la JVM fourchue?
dsg
2
avec à killpartir de la ligne de commande, ou dans le Gestionnaire des tâches (Windows), ou Forcer à quitter ou Moniteur d'activité (Mac OS X), etc.
Seth Tisue
Après avoir bifurqué, pour tuer tout java sauf sbt, exécutez:kill -9 `ps -h | grep java | grep -v sbt-launch | grep -v grep | awk '{print $1}'`
dsg
1
J'adore cette idée, mais cela ne semble pas aider. J'exécute sbt 0.13.1 et j'ajoute cette ligne dans mon fichier build.sbt ..
doub1ejack
vous devez tuer le runavec CTRL + D
Timofey
82

À partir de la version 0.13.5 de sbt, vous pouvez ajouter à votre build.sbt

cancelable in Global := true

Il est défini comme "Active (true) ou désactive (false) la possibilité d'interrompre l'exécution de la tâche avec CTRL + C." dans la définition des clés

Si vous utilisez Scala 2.12.7+, vous pouvez également annuler la compilation avec CTRL + C. Référence https://github.com/scala/scala/pull/6479

Il y a quelques bugs rapportés:

Jonas Anso
la source
5

J'ai trouvé ce qui suit utile lorsque j'ai le contrôle sur la boucle principale de l'application exécutée à partir de sbt.

Je dis à sbt de fork lors de l'exécution de l'application (dans build.sbt):

fork in run := true

Je dis également à sbt de transmettre stdin du shell sbt à l'application (dans build.sbt):

connectInput in run := true

Enfin, dans le thread principal de l'application, j'attends la fin du fichier sur stdin puis j'arrête la JVM:

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

Bien sûr, vous pouvez utiliser n'importe quel thread pour lire stdin et shutdown, pas seulement le thread principal.

Enfin, démarrez sbt, basculez éventuellement vers le sous-projet que vous souhaitez exécuter, exécutez.

Maintenant, lorsque vous souhaitez arrêter le processus, fermez son stdin en tapant CTRL-D dans le shell sbt.

kilo
la source
1

Pensez à utiliser sbt-revolver . Nous l'utilisons dans notre entreprise et c'est vraiment pratique. Ce que vous demandez peut être fait avec:

reStart

reStop

Sans avoir besoin de configurer le fichier build.sbt.

Vous pouvez utiliser ce plugin en ajoutant:

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

Vers votre projet / plugins.sbt

mtsokol
la source