Ich habe dieses einfache Skript:
var exec = require('child_process').exec;
exec('coffee -cw my_file.coffee', function(error, stdout, stderr) {
console.log(stdout);
});
wo ich einfach einen Befehl ausführe, um eine Kaffeeskriptdatei zu kompilieren. Aber stdout wird nie in der Konsole angezeigt, da der Befehl nie endet (wegen der Option -w für Kaffee). Wenn ich den Befehl direkt von der Konsole aus ausführe, erhalte ich folgende Meldung:
18:05:59 - compiled my_file.coffee
Meine Frage ist: Ist es möglich, diese Nachrichten mit der Datei node.js exec anzuzeigen? Wenn ja wie? !
Vielen Dank
node.js
coffeescript
mravey
quelle
quelle
Antworten:
Nicht benutzen
exec
. Verwenden Sie,spawn
welches einEventEmmiter
Objekt ist. Dann können Siestdout
/stderr
events (spawn.stdout.on('data',callback..)
) anhören, sobald sie eintreten .Aus der NodeJS-Dokumentation:
exec
puffert die Ausgabe und gibt sie normalerweise zurück, wenn der Befehl ausgeführt wurde.quelle
flush(stdout);
in C) leeren, um Ereignisse in Node.js auszulösen.exec
gibt auch ein ChildProcess-Objekt zurück, das ein EventEmitter ist.ODER
pipe
die Standardausgabe des untergeordneten Prozesses zur Hauptausgabe.ODER erben Sie stdio mit spawn
quelle
pipe
:coffeeProcess.stdout.pipe(process.stdout);
spawn(cmd, argv, { stdio: 'inherit' })
. Weitere Beispiele finden Sie unter nodejs.org/api/child_process.html#child_process_options_stdio .spawn
mitstdio: 'inherit'
. Es erzeugt eine genauere Ausgabe alsexec
und pipingstdout
/stderr
, beispielsweise wenn die Fortschrittsinformationen von a angezeigt werdengit clone
.Es gibt bereits mehrere Antworten, aber keine von ihnen erwähnt den besten (und einfachsten) Weg, dies zu tun, nämlich die Verwendung
spawn
und die{ stdio: 'inherit' }
Option . Es scheint die genaueste Ausgabe zu liefern, beispielsweise wenn die Fortschrittsinformationen von a angezeigt werdengit clone
.Mach das einfach:
Dank an @MorganTouvereyQuilling für den Hinweis in diesem Kommentar .
quelle
stdio: "inherit"
diese Formatierung beibehalten wird, währendchild.stdout.pipe(process.stdout)
dies nicht der Fall ist.Ich möchte nur hinzufügen, dass ein kleines Problem bei der Ausgabe der Pufferzeichenfolgen aus einem gespawnten Prozess darin
console.log()
besteht, dass Zeilenumbrüche hinzugefügt werden, die die Ausgabe Ihres gespawnten Prozesses auf zusätzliche Zeilen verteilen können. Wenn Siestdout
oderstderr
mitprocess.stdout.write()
statt ausgebenconsole.log()
, erhalten Sie die Konsolenausgabe aus dem erzeugten Prozess "wie sie ist".Ich habe diese Lösung hier gesehen: Node.js: Drucken auf die Konsole ohne nachgestellten Zeilenumbruch?
Ich hoffe, das hilft jemandem bei der Verwendung der oben genannten Lösung (die sich hervorragend für die Live-Ausgabe eignet, auch wenn sie aus der Dokumentation stammt).
quelle
spawn(command, args, { stdio: 'inherit' })
, wie von @MorganTouvereyQuilling hier vorgeschlagen. Stackoverflow.com/questions/10232192/…Inspiriert von Nathanael Smiths Antwort und Eric Freeses Kommentar könnte es so einfach sein wie:
quelle
ls
, schlägt jedoch für komplexere Befehle wie fehlnpm install
. Ich habe sogar versucht, sowohl stdout als auch stderr zu ihren jeweiligen Prozessobjekten zu leiten.spawn(command, args, { stdio: 'inherit' })
, wie hier vorgeschlagen stackoverflow.com/questions/10232192/…Ich fand es hilfreich, meinen Dienstprogrammen, die dies tun, ein benutzerdefiniertes Exec-Skript hinzuzufügen.
utilities.js
app.js.
quelle
Nachdem ich alle anderen Antworten überprüft hatte, kam ich zu folgendem Ergebnis:
Manchmal
data
sind es mehrere Zeilen, sodass dieoldSchoolMakeBuild
Überschrift für mehrere Zeilen einmal angezeigt wird. Aber das hat mich nicht genug gestört, um es zu ändern.quelle
child_process.spawn gibt ein Objekt mit stdout- und stderr-Streams zurück. Sie können auf den Stream stdout tippen, um Daten zu lesen, die der untergeordnete Prozess an Node zurücksendet. stdout als Stream hat die "Daten", "Ende" und andere Ereignisse, die Streams haben. spawn ist am besten geeignet, wenn der untergeordnete Prozess eine große Datenmenge an Node zurückgeben soll - Bildverarbeitung, Lesen von Binärdaten usw.
So können Sie Ihr Problem mit child_process.spawn lösen, wie unten verwendet.
quelle
Hier ist eine asynchrone Hilfsfunktion, die in Typoskript geschrieben ist und den Trick für mich zu tun scheint. Ich denke, dies wird nicht für langlebige Prozesse funktionieren, könnte aber dennoch für jemanden nützlich sein?
quelle