Estou no processo de portar uma biblioteca CLI do Ruby para o Node.js. No meu código, executo vários binários de terceiros quando necessário. Não tenho certeza da melhor maneira de fazer isso no Node.
Aqui está um exemplo no Ruby em que chamo PrinceXML para converter um arquivo em PDF:
cmd = system("prince -v builds/pdf/book.html -o builds/pdf/book.pdf")
Qual é o código equivalente no Nó?
javascript
ruby
node.js
command-line-interface
Dave Thompson
fonte
fonte
Respostas:
Para uma versão ainda mais recente do Node.js (v8.1.4), os eventos e as chamadas são semelhantes ou idênticas às versões mais antigas, mas é recomendável usar os recursos de idioma mais recentes padrão. Exemplos:
Para saída formatada em buffer e sem fluxo (você obtém tudo de uma vez), use
child_process.exec
:Você também pode usá-lo com o Promises:
Se você deseja receber os dados gradualmente em partes (saída como um fluxo), use
child_process.spawn
:Ambas as funções têm uma contraparte síncrona. Um exemplo para
child_process.execSync
:Bem como
child_process.spawnSync
:Nota: O código a seguir ainda está funcional, mas é voltado principalmente para usuários do ES5 e anteriores.
O módulo para gerar processos filhos com o Node.js está bem documentado na documentação (v5.0.0). Para executar um comando e buscar sua saída completa como um buffer, use
child_process.exec
:Se você precisar usar E / S de processo de manipulação com fluxos, como quando espera grandes quantidades de saída, use
child_process.spawn
:Se você estiver executando um arquivo em vez de um comando, convém usar
child_process.execFile
quais parâmetros são quase idênticosspawn
, mas tem um quarto parâmetro de retorno de chamada comoexec
para recuperar buffers de saída. Isso pode parecer um pouco com isso:A partir da v0.11.12 , o Nó agora suporta síncrono
spawn
eexec
. Todos os métodos descritos acima são assíncronos e têm uma contrapartida síncrona. A documentação para eles pode ser encontrada aqui . Embora sejam úteis para scripts, observe que, diferentemente dos métodos usados para gerar processos filho de forma assíncrona, os métodos síncronos não retornam uma instância deChildProcess
.fonte
child.pipe(dest)
(que não existe), você deve usarchild.stdout.pipe(dest)
echild.stderr.pipe(dest)
, por exemplo,child.stdout.pipe(process.stdout)
echild.stderr.pipe(process.stderr)
.echo "hello"
eecho "world"
.Nó JS
v13.9.0
, LTSv12.16.1
ev10.19.0
--- Mar 2020Método assíncrono (Unix):
Método assíncrono (Windows):
Sincronizar:
Da documentação do Node.js v13.9.0
O mesmo vale para Node.js Documentação v12.16.1 e Documentação v10.19.0 Node.js
fonte
'cmd', ['/c', 'dir']
. Pelo menos eu estava apenas procura alta e baixa porque'dir'
sem argumentos não trabalho antes de me lembrar isso ...;)Você está procurando child_process.exec
Aqui está o exemplo:
fonte
data
eventos no stdout. Procure nos documentos, mas deve ser algo parecidochildProc.stdout.on("data", fn)
.fonte
Desde a versão 4, a alternativa mais próxima é o
child_process.execSync
método:Observe que a
execSync
chamada bloqueia o loop de eventos.fonte
child_process
ser criado quando se usaexecSync
? E ele é removido logo após o comando, certo? Então, não há vazamento de memória?Se você deseja algo que se assemelhe à resposta principal, mas também seja síncrono, isso funcionará.
fonte
Acabei de escrever um ajudante de Cli para lidar com Unix / windows facilmente.
Javascript:
Arquivo de origem original datilografado:
fonte
Agora você pode usar shelljs (do nó v4) da seguinte maneira:
fonte
Se você não se importa com uma dependência e deseja usar promessas,
child-process-promise
funciona:instalação
uso de exec
uso de spawn
fonte
Use este
npm
pacote leve :system-commands
Veja aqui .
Importe-o assim:
Execute comandos como este:
fonte
A resposta da @ hexacyanide é quase completa. No comando do Windows
prince
poderia serprince.exe
,prince.cmd
,prince.bat
ou apenasprince
(eu não sou ciente de como gemas são empacotados, mas bins NPM vêm com um script sh e um script em lotes -npm
enpm.cmd
). Se você deseja escrever um script portátil que funcione no Unix e no Windows, é necessário gerar o executável correto.Aqui está uma função de desova simples e portátil:
fonte