SBT przestaje działać bez wychodzenia

120

Jak zakończyć bieg w SBT bez wychodzenia?

Próbuję CTRL + C, ale wychodzi z SBT. Czy istnieje sposób, aby zamknąć uruchomioną aplikację tylko przy otwartym SBT?

dsg
źródło
Ctrl+Dnie działa.
botchniaque
Myślę, że Ctrl + Ddziała tylko dla frameworka Play.
EnverOsmanov

Odpowiedzi:

44

W konfiguracji domyślnej Twoje uruchomienia odbywają się w tej samej JVM, na której działa sbt, więc nie możesz ich łatwo zabić osobno.

Jeśli wykonujesz swój bieg w oddzielnym, rozwidlonym JVM, jak opisano w Forking , możesz zabić tę JVM (w dowolny sposób oferowany przez system operacyjny) bez wpływu na JVM sbt:

fork in run := true
Seth Tisue
źródło
9
Próbuję to zrobić. W szczególności zaimplementowałem: stackoverflow.com/questions/3868863/ ... ale sbt nadal wychodzi, gdy robię CTRL + C. Jak zabić tylko rozwidloną maszynę JVM?
dsg
2
z killwiersza poleceń lub w Menedżerze zadań (Windows) lub Force Quit lub Activity Monitor (Mac OS X) itp.
Seth Tisue
Po rozwidleniu, aby zabić wszystko, co java oprócz sbt, uruchom:kill -9 `ps -h | grep java | grep -v sbt-launch | grep -v grep | awk '{print $1}'`
dsg
1
Podoba mi się ten pomysł, ale wydaje się, że nie pomaga. Uruchamiam sbt 0.13.1 i dodaję ten wiersz do mojego pliku build.sbt ..
wątpliwość1ejack
musisz zabić runCTRL + D
Timofey
82

Od wersji sbt 0.13.5 możesz dodać do swojego build.sbt

cancelable in Global := true

Jest zdefiniowane jako „Włącza (prawda) lub wyłącza (fałsz) możliwość przerwania wykonywania zadania za pomocą CTRL + C”. w definicji kluczy

Jeśli używasz Scala 2.12.7+, możesz również anulować kompilację za pomocą CTRL + C. Odniesienie https://github.com/scala/scala/pull/6479

Zgłoszono kilka błędów:

Jonas Anso
źródło
5

Znalazłem następujące przydatne, gdy mam kontrolę nad główną pętlą aplikacji uruchamianej z sbt.

Mówię sbt o rozwidlenie podczas uruchamiania aplikacji (w build.sbt):

fork in run := true

Mówię też sbt, aby przekazał stdin z powłoki sbt do aplikacji (w build.sbt):

connectInput in run := true

Na koniec w głównym wątku aplikacji czekam na koniec pliku na stdin, a następnie zamykam JVM:

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

Oczywiście możesz użyć dowolnego wątku do odczytu wejścia standardowego i zamknięcia systemu, a nie tylko wątku głównego.

Na koniec uruchom sbt, opcjonalnie przełącz się na podprojekt, który chcesz uruchomić, uruchom.

Teraz, gdy chcesz zatrzymać proces, zamknij jego stdin, wpisując CTRL-D w powłoce sbt.

kilogram
źródło
1

Rozważ użycie rewolweru SBT . Używamy go w naszej firmie i jest naprawdę przydatny. O to, o co prosisz, można zrobić:

reStart

reStop

Bez potrzeby konfigurowania pliku build.sbt.

Możesz użyć tej wtyczki, dodając:

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

Do twojego projektu / plugins.sbt

mtsokol
źródło