Estoy en el proceso de portar una biblioteca CLI de Ruby a Node.js. En mi código ejecuto varios binarios de terceros cuando es necesario. No estoy seguro de cómo lograr esto en Node.
Aquí hay un ejemplo en Ruby donde llamo a PrinceXML para convertir un archivo a PDF:
cmd = system("prince -v builds/pdf/book.html -o builds/pdf/book.pdf")
¿Cuál es el código equivalente en el nodo?
javascript
ruby
node.js
command-line-interface
Dave Thompson
fuente
fuente
Respuestas:
Para una versión aún más nueva de Node.js (v8.1.4), los eventos y las llamadas son similares o idénticos a las versiones anteriores, pero se recomienda utilizar las funciones estándar de lenguaje más nuevas. Ejemplos:
Para la salida con formato no almacenado en búfer (se obtiene todo de una vez), use
child_process.exec
:También puedes usarlo con Promesas:
Si desea recibir los datos gradualmente en fragmentos (salida como una secuencia), use
child_process.spawn
:Ambas funciones tienen una contraparte síncrona. Un ejemplo para
child_process.execSync
:Además de
child_process.spawnSync
:Nota: El siguiente código sigue siendo funcional, pero está dirigido principalmente a usuarios de ES5 y anteriores.
El módulo para generar procesos secundarios con Node.js está bien documentado en la documentación (v5.0.0). Para ejecutar un comando y obtener su salida completa como un búfer, use
child_process.exec
:Si necesita utilizar la E / S del proceso de manejo con flujos, como cuando espera grandes cantidades de salida, use
child_process.spawn
:Si está ejecutando un archivo en lugar de un comando, es posible que desee utilizar
child_process.execFile
qué parámetros son casi idénticosspawn
, pero tiene un cuarto parámetro de devolución de llamada comoexec
para recuperar buffers de salida. Eso podría verse un poco así:A partir de v0.11.12 , Node ahora admite síncronos
spawn
yexec
. Todos los métodos descritos anteriormente son asíncronos y tienen una contraparte síncrona. La documentación para ellos se puede encontrar aquí . Si bien son útiles para las secuencias de comandos, tenga en cuenta que, a diferencia de los métodos utilizados para generar procesos secundarios de forma asincrónica, los métodos sincrónicos no devuelven una instancia deChildProcess
.fuente
child.pipe(dest)
(que no existe), debe usarchild.stdout.pipe(dest)
ychild.stderr.pipe(dest)
, por ejemplo,child.stdout.pipe(process.stdout)
ychild.stderr.pipe(process.stderr)
.echo "hello"
yecho "world"
.Nodo JS
v13.9.0
, LTSv12.16.1
yv10.19.0
--- Mar 2020Método asíncrono (Unix):
Método asíncrono (Windows):
Sincronización:
De Node.js v13.9.0 Documentation
Lo mismo ocurre con Node.js v12.16.1 Documentation y Node.js v10.19.0 Documentation
fuente
'cmd', ['/c', 'dir']
. Al menos solo buscaba por todas'dir'
Usted busca child_process.exec
Aquí está el ejemplo:
fuente
data
eventos en stdout. Mira en los documentos, pero debe ser algo asíchildProc.stdout.on("data", fn)
.fuente
Desde la versión 4, la alternativa más cercana es el
child_process.execSync
método:Tenga en cuenta que la
execSync
llamada bloquea el bucle de eventos.fuente
child_process
crea un ser cuando se usaexecSync
? ¿Y se elimina justo después del comando, verdad? Entonces, ¿no hay pérdidas de memoria?Si desea algo que se parezca mucho a la respuesta principal pero que también sea sincrónico, esto funcionará.
fuente
Acabo de escribir un asistente de Cli para tratar con Unix / Windows fácilmente.
Javascript:
Archivo fuente original mecanografiado:
fuente
Si no te importa una dependencia y quieres usar promesas,
child-process-promise
funciona:instalación
uso ejecutivo
uso de spawn
fuente
Ahora puede usar shelljs (del nodo v4) de la siguiente manera:
fuente
Use este
npm
paquete liviano :system-commands
Míralo aquí .
Importarlo así:
Ejecute comandos como este:
fuente
La respuesta de @hexacyanide es casi completa. En Windows comando
prince
podría serprince.exe
,prince.cmd
,prince.bat
o simplementeprince
(no soy consciente de cómo se agrupan las gemas, pero NGP contenedores vienen con un script sh y una escritura de la hornada -npm
ynpm.cmd
). Si desea escribir un script portátil que se ejecute en Unix y Windows, debe generar el ejecutable correcto.Aquí hay una función de generación simple pero portátil:
fuente