Eu tenho esse script simples:
var exec = require('child_process').exec;
exec('coffee -cw my_file.coffee', function(error, stdout, stderr) {
console.log(stdout);
});
onde simplesmente executo um comando para compilar um arquivo de script de café. Mas o stdout nunca é exibido no console, porque o comando nunca termina (por causa da opção -w do café). Se eu executar o comando diretamente do console, recebo uma mensagem como esta:
18:05:59 - compiled my_file.coffee
Minha pergunta é: é possível exibir essas mensagens com o node.js exec? Se sim, como? !
obrigado
node.js
coffeescript
mravey
fonte
fonte
Respostas:
Não use
exec
. Usespawn
qual é umEventEmmiter
objeto. Então você pode ouvirstdout
/stderr
events (spawn.stdout.on('data',callback..)
) conforme eles acontecem .Da documentação do NodeJS:
exec
armazena em buffer a saída e geralmente a retorna quando o comando termina de executar.fonte
flush(stdout);
em C) para disparar eventos no Node.js.exec
também retornará um objeto ChildProcess que é um EventEmitter.OU
pipe
o stdout do processo filho para o stdout principal.OU herdar stdio usando spawn
fonte
pipe
:coffeeProcess.stdout.pipe(process.stdout);
spawn(cmd, argv, { stdio: 'inherit' })
. Consulte nodejs.org/api/child_process.html#child_process_options_stdio para obter exemplos diferentes.spawn
comstdio: 'inherit'
. Produz uma saída mais precisa do que umaexec
tubulaçãostdout
/stderr
, por exemplo, ao exibir as informações de progresso de agit clone
.Já existem várias respostas, no entanto, nenhuma delas menciona a melhor (e mais fácil) maneira de fazer isso, que está usando
spawn
e a{ stdio: 'inherit' }
opção . Parece produzir a saída mais precisa, por exemplo, ao exibir as informações de progresso de umgit clone
.Simplesmente faça o seguinte:
Os nossos agradecimentos a @MorganTouvereyQuilling por apontar isso neste comentário .
fonte
stdio: "inherit"
preserva essa formatação enquantochild.stdout.pipe(process.stdout)
não.Gostaria apenas de acrescentar que um pequeno problema com a saída das seqüências de buffer de um processo gerado
console.log()
é que ela adiciona novas linhas, que podem espalhar a saída do processo gerado por linhas adicionais. Se você imprimirstdout
oustderr
com emprocess.stdout.write()
vez deconsole.log()
, obterá a saída do console do processo gerado 'como está'.Eu vi essa solução aqui: Node.js: imprimindo no console sem uma nova linha à direita?
Espero que ajude alguém a usar a solução acima (que é ótima para saída ao vivo, mesmo que seja da documentação).
fonte
spawn(command, args, { stdio: 'inherit' })
, conforme sugerido por @MorganTouvereyQuilling aqui stackoverflow.com/questions/10232192/…Inspirado na resposta de Nathanael Smith e no comentário de Eric Freese, pode ser tão simples quanto:
fonte
ls
mas falha em comandos mais complexos, comonpm install
. Até tentei canalizar stdout e stderr para seus respectivos objetos de processo.spawn(command, args, { stdio: 'inherit' })
, como sugerido aqui stackoverflow.com/questions/10232192/…Eu achei útil adicionar um script exec personalizado aos meus utilitários que fazem isso.
utilities.js
app.js
fonte
Depois de revisar todas as outras respostas, acabei com isso:
Às vezes,
data
haverá várias linhas, portanto ooldSchoolMakeBuild
cabeçalho aparecerá uma vez para várias linhas. Mas isso não me incomodou o suficiente para mudar isso.fonte
child_process.spawn retorna um objeto com os fluxos stdout e stderr. Você pode tocar no fluxo stdout para ler os dados que o processo filho envia de volta ao Nó. stdout sendo um fluxo possui os "dados", "fim" e outros eventos que os fluxos têm. o spawn é melhor usado quando você deseja que o processo filho retorne uma grande quantidade de dados ao Nó - processamento de imagem, leitura de dados binários etc.
para que você possa resolver seu problema usando child_process.spawn, conforme usado abaixo.
fonte
Aqui está uma função auxiliar assíncrona escrita em texto datilografado que parece fazer o truque para mim. Eu acho que isso não vai funcionar para processos de longa duração, mas ainda pode ser útil para alguém?
fonte