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?


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

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:


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.


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

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.