node.js - objects - coffeescript vs typescript
Exec: mostrar stdout "en vivo" (8)
Después de revisar todas las otras respuestas, terminé con esto:
function oldSchoolMakeBuild(cb) {
var makeProcess = exec(''make -C ./oldSchoolMakeBuild'',
function (error, stdout, stderr) {
stderr && console.error(stderr);
cb(error);
});
makeProcess.stdout.on(''data'', function(data) {
process.stdout.write(''oldSchoolMakeBuild: ''+ data);
});
}
A veces los data
serán líneas múltiples, por lo que el encabezado oldSchoolMakeBuild
aparecerá una vez para líneas múltiples. Pero esto no me molestó lo suficiente como para cambiarlo.
Tengo este simple script:
var exec = require(''child_process'').exec;
exec(''coffee -cw my_file.coffee'', function(error, stdout, stderr) {
console.log(stdout);
});
donde simplemente ejecuto un comando para compilar un archivo de script de café. Pero stdout nunca se muestra en la consola, porque el comando nunca termina (debido a la opción -w del café). Si ejecuto el comando directamente desde la consola, recibo un mensaje como este:
18:05:59 - compiled my_file.coffee
Mi pregunta es: ¿es posible mostrar estos mensajes con el executor node.js? Si es así, ¿cómo? !
Gracias
Inspirado por la respuesta de Nathanael Smith y el comentario de Eric Freese, podría ser tan simple como:
var exec = require(''child_process'').exec;
exec(''coffee -cw my_file.coffee'').stdout.pipe(process.stdout);
Me gustaría agregar que un pequeño problema con la salida de las cadenas de almacenamiento intermedio de un proceso generado con console.log()
es que agrega nuevas líneas, lo que puede extender la producción de su proceso engendrado en líneas adicionales. Si imprime stdout
o stderr
con process.stdout.write()
lugar de console.log()
, obtendrá la salida de la consola desde el proceso generado ''tal cual''.
Vi la solución aquí: Node.js: ¿imprimiendo en la consola sin una nueva línea al final?
Espero que ayude a alguien que usa la solución anterior (que es excelente para la salida en vivo, incluso si proviene de la documentación).
Me pareció útil agregar un script exec personalizado a mis utilidades que hace esto.
utilities.js
const { exec } = require(''child_process'')
module.exports.exec = (command) => {
const process = exec(command)
process.stdout.on(''data'', (data) => {
console.log(''stdout: '' + data.toString())
})
process.stderr.on(''data'', (data) => {
console.log(''stderr: '' + data.toString())
})
process.on(''exit'', (code) => {
console.log(''child process exited with code '' + code.toString())
})
}
app.js
const { exec } = require(''./utilities.js)
exec(''coffee -cw my_file.coffee'')
No use exec
. Use spawn
que es un objeto EventEmmiter
. Luego puede escuchar eventos stdout
/ stderr
( spawn.stdout.on(''data'',callback..)
) a medida que ocurren .
De la documentación de NodeJS:
var spawn = require(''child_process'').spawn,
ls = spawn(''ls'', [''-lh'', ''/usr'']);
ls.stdout.on(''data'', function (data) {
console.log(''stdout: '' + data.toString());
});
ls.stderr.on(''data'', function (data) {
console.log(''stderr: '' + data.toString());
});
ls.on(''exit'', function (code) {
console.log(''child process exited with code '' + code.toString());
});
exec
almacena el resultado y generalmente lo devuelve cuando el comando ha terminado de ejecutarse.
Ya hay varias respuestas, sin embargo, ninguna de ellas menciona la mejor (y más fácil) forma de hacerlo, que es usar spawn
y la nodejs.org/api/child_process.html#child_process_options_stdio . Parece producir el resultado más preciso, por ejemplo, al mostrar la información de progreso de un git clone
.
Simplemente haz esto:
var spawn = require(''child_process'').spawn;
spawn(''coffee'', [''-cw'', ''my_file.coffee''], { stdio: ''inherit'' });
Gracias a @MorganTouvereyQuilling por señalar esto en este comentario .
child_process.spawn devuelve un objeto con stdout y stderr streams. Puede tocar en la transmisión stdout para leer los datos que el proceso hijo envía de vuelta a Node. stdout siendo una secuencia tiene los "datos", "fin" y otros eventos que tienen las transmisiones. La función spawn se utiliza mejor cuando se desea que el proceso hijo devuelva una gran cantidad de datos al nodo: procesamiento de imágenes, lectura de datos binarios, etc.
para que pueda resolver su problema usando child_process.spawn como se usa a continuación.
var spawn = require(''child_process'').spawn,
ls = spawn(''coffee -cw my_file.coffee'');
ls.stdout.on(''data'', function (data) {
console.log(''stdout: '' + data.toString());
});
ls.stderr.on(''data'', function (data) {
console.log(''stderr: '' + data.toString());
});
ls.on(''exit'', function (code) {
console.log(''code '' + code.toString());
});
exec
también devolverá un objeto ChildProcess que es un EventEmitter.
var exec = require(''child_process'').exec;
var coffeeProcess = exec(''coffee -cw my_file.coffee'');
coffeeProcess.stdout.on(''data'', function(data) {
console.log(data);
});
O canalice la salida estándar del proceso secundario a la salida estándar principal.
coffeeProcess.stdout.pipe(process.stdout);