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.execFilequé parámetros son casi idénticosspawn, pero tiene un cuarto parámetro de devolución de llamada comoexecpara recuperar buffers de salida. Eso podría verse un poco así:A partir de v0.11.12 , Node ahora admite síncronos
spawnyexec. 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.1yv10.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
dataeventos 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.execSyncmétodo:Tenga en cuenta que la
execSyncllamada bloquea el bucle de eventos.fuente
child_processcrea 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-promisefunciona:instalación
uso ejecutivo
uso de spawn
fuente
Ahora puede usar shelljs (del nodo v4) de la siguiente manera:
fuente
Use este
npmpaquete liviano :system-commandsMíralo aquí .
Importarlo así:
Ejecute comandos como este:
fuente
La respuesta de @hexacyanide es casi completa. En Windows comando
princepodría serprince.exe,prince.cmd,prince.bato 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 -npmynpm.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