Saya punya skrip sederhana ini:
var exec = require('child_process').exec;
exec('coffee -cw my_file.coffee', function(error, stdout, stderr) {
console.log(stdout);
});
di mana saya hanya menjalankan perintah untuk mengkompilasi file skrip kopi. Tetapi stdout tidak pernah ditampilkan di konsol, karena perintahnya tidak pernah berakhir (karena opsi -w dari kopi). Jika saya menjalankan perintah langsung dari konsol saya mendapatkan pesan seperti ini:
18:05:59 - compiled my_file.coffee
Pertanyaan saya adalah: apakah mungkin untuk menampilkan pesan-pesan ini dengan node.js exec? Jika ya, bagaimana? !
Terima kasih
node.js
coffeescript
Mravey
sumber
sumber
Jawaban:
Jangan gunakan
exec
. Gunakanspawn
yang merupakanEventEmmiter
objek. Kemudian Anda dapat mendengarkanstdout
/stderr
acara (spawn.stdout.on('data',callback..)
) saat itu terjadi .Dari dokumentasi NodeJS:
exec
buffer output dan biasanya mengembalikannya ketika perintah telah selesai dieksekusi.sumber
flush(stdout);
dalam C) untuk memecat peristiwa di Node.js.exec
juga akan mengembalikan objek ChildProcess yang merupakan EventEmitter.ATAU
pipe
proses anak stdout ke stdout utama.ATAU mewarisi stdio menggunakan spawn
sumber
pipe
:coffeeProcess.stdout.pipe(process.stdout);
spawn(cmd, argv, { stdio: 'inherit' })
. Lihat nodejs.org/api/child_process.html#child_process_options_stdio untuk contoh berbeda.spawn
bersamastdio: 'inherit'
. Ini menghasilkan keluaran lebih akurat daripadaexec
dan perpipaanstdout
/stderr
, misalnya ketika menampilkan informasi kemajuan dari agit clone
.Sudah ada beberapa jawaban namun tidak satupun dari mereka menyebutkan cara terbaik (dan termudah) untuk melakukan ini, yaitu menggunakan
spawn
dan{ stdio: 'inherit' }
opsi . Tampaknya menghasilkan output paling akurat, misalnya ketika menampilkan informasi kemajuan dari agit clone
.Cukup lakukan ini:
Kredit ke @MorganTouvereyQuilling karena menunjukkan ini dalam komentar ini .
sumber
stdio: "inherit"
mempertahankan format itu sementarachild.stdout.pipe(process.stdout)
tidak.Saya hanya ingin menambahkan bahwa satu masalah kecil dengan mengeluarkan string buffer dari proses spawned dengan
console.log()
itu menambahkan baris baru, yang dapat menyebarkan output proses spawned Anda melalui baris tambahan. Jika Anda keluaranstdout
ataustderr
denganprocess.stdout.write()
bukanconsole.log()
, maka Anda akan mendapatkan keluaran konsol dari proses spawned 'apa adanya'.Saya melihat solusi itu di sini: Node.js: mencetak ke konsol tanpa baris baru yang tertinggal?
Harapan yang membantu seseorang menggunakan solusi di atas (yang merupakan solusi yang bagus untuk live output, bahkan jika itu dari dokumentasi).
sumber
spawn(command, args, { stdio: 'inherit' })
, seperti yang disarankan oleh @MorganTouvereyQuilling di sini stackoverflow.com/questions/10232192/…Terinspirasi oleh jawaban Nathanael Smith dan komentar Eric Freese, itu bisa sesederhana:
sumber
ls
tetapi gagal untuk perintah yang lebih kompleks sepertinpm install
. Saya bahkan mencoba memipatkan stdout dan stderr ke objek proses masing-masing.spawn(command, args, { stdio: 'inherit' })
, seperti yang disarankan di sini stackoverflow.com/questions/10232192/…Saya merasa terbantu untuk menambahkan skrip exec kustom ke utilitas saya yang melakukan ini.
utilities.js
app.js
sumber
Setelah meninjau semua jawaban lain, saya berakhir dengan ini:
Terkadang
data
akan banyak baris, sehinggaoldSchoolMakeBuild
tajuk akan muncul sekali untuk beberapa baris. Tapi ini tidak cukup mengganggu saya untuk mengubahnya.sumber
child_process.spawn mengembalikan objek dengan stdout dan stderr stream. Anda dapat mengetuk aliran stdout untuk membaca data yang dikirim proses anak kembali ke Node. stdout menjadi stream memiliki "data", "end", dan event lainnya yang stream miliki. spawn paling baik digunakan ketika Anda ingin proses anak mengembalikan sejumlah besar data ke Node - pemrosesan gambar, membaca data biner dll.
sehingga Anda dapat menyelesaikan masalah Anda menggunakan child_process.spawn seperti yang digunakan di bawah ini.
sumber
Berikut adalah fungsi pembantu async yang ditulis dalam naskah yang tampaknya melakukan trik untuk saya. Saya kira ini tidak akan bekerja untuk proses berumur panjang tetapi masih mungkin berguna bagi seseorang?
sumber