O SBT para de executar sem sair

120

Como você encerra uma execução no SBT sem sair?

Estou tentando CTRL + C, mas ele sai do SBT. Existe uma maneira de sair apenas do aplicativo em execução enquanto mantém o SBT aberto?

dsg
fonte
Ctrl+Dnão funciona.
Botchniaque
Eu acho que Ctrl + Dfunciona apenas para o framework Play.
EnverOsmanov

Respostas:

44

Na configuração padrão, suas execuções acontecem na mesma JVM que o sbt está executando, portanto, você não pode matá-las facilmente separadamente.

Se você executar sua execução em uma JVM bifurcada separada, conforme descrito em Forking , poderá matá-la (por qualquer meio que seu sistema operacional oferecer) sem afetar a JVM da sbt:

fork in run := true
Seth Tisue
fonte
9
Estou tentando fazer isso. Especificamente, eu implementei: stackoverflow.com/questions/3868863/…, mas o sbt ainda sai quando eu faço CTRL + C. Como eu mato apenas a JVM bifurcada?
dsg 20/03
2
com killa partir da linha de comando, ou no Gerenciador de Tarefas (Windows), ou Forçar Encerrar ou Activity Monitor (Mac OS X), etc.
Seth tisue
Depois de bifurcar, para matar tudo o que é java, exceto o sbt, execute:kill -9 `ps -h | grep java | grep -v sbt-launch | grep -v grep | awk '{print $1}'`
dsg
1
Eu amo essa idéia, mas não parece ajudar. Estou correndo sbt 0.13.1 e adicionando esta linha no meu arquivo build.sbt ..
doub1ejack
você precisa matar o runcom CTRL + D
Timofey
82

Na versão 0.13.5 do sbt, você pode adicionar ao seu build.sbt

cancelable in Global := true

É definido como "Habilita (verdadeiro) ou desabilita (falso) a capacidade de interromper a execução da tarefa com CTRL + C". no definição de chaves

Se você estiver usando o Scala 2.12.7+, também poderá cancelar a compilação com CTRL + C. Referência https://github.com/scala/scala/pull/6479

Existem alguns erros relatados:

Jonas Anso
fonte
5

Eu achei o seguinte útil quando tenho controle sobre o loop principal do aplicativo que está sendo executado a partir do sbt.

Eu digo ao sbt para bifurcar ao executar o aplicativo (no build.sbt):

fork in run := true

Eu também digo ao sbt para encaminhar o stdin do shell sbt para o aplicativo (no build.sbt):

connectInput in run := true

Finalmente, no encadeamento principal do aplicativo, espero o final do arquivo no stdin e, em seguida, encerro a JVM:

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

Obviamente, você pode usar qualquer thread para ler stdin e shutdown, não apenas o thread principal.

Por fim, inicie o sbt, alternativamente, alterne para o subprojeto que deseja executar, execute.

Agora, quando você quiser interromper o processo, feche seu stdin digitando CTRL-D no shell sbt.

quilo
fonte
1

Considere usar o sbt-revolver . Nós o usamos em nossa empresa e é realmente útil. O que você está pedindo pode ser feito com:

reStart

reStop

Sem a necessidade de configurar o arquivo build.sbt.

Você pode usar este plugin adicionando:

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

Para o seu projeto / plugins.sbt

mtsokol
fonte