Saya sedang dalam proses porting perpustakaan CLI dari Ruby ke Node.js. Dalam kode saya, saya menjalankan beberapa binari pihak ketiga bila perlu. Saya tidak yakin bagaimana cara terbaik untuk melakukannya di Node.
Berikut ini contoh di Ruby tempat saya memanggil PrinceXML untuk mengonversi file ke PDF:
cmd = system("prince -v builds/pdf/book.html -o builds/pdf/book.pdf")
Apa kode yang setara di Node?
javascript
ruby
node.js
command-line-interface
Dave Thompson
sumber
sumber
Jawaban:
Untuk versi Node.js yang lebih baru (v8.1.4), acara dan panggilannya serupa atau identik dengan versi yang lebih lama, tetapi dianjurkan untuk menggunakan fitur bahasa standar yang lebih baru. Contoh:
Untuk buffer, output diformat non-aliran (Anda mendapatkan semuanya sekaligus), gunakan
child_process.exec
:Anda juga dapat menggunakannya dengan Janji:
Jika Anda ingin menerima data secara bertahap dalam potongan (output sebagai aliran), gunakan
child_process.spawn
:Kedua fungsi ini memiliki mitra sinkron. Contoh untuk
child_process.execSync
:Dan juga
child_process.spawnSync
:Catatan: Kode berikut masih berfungsi, tetapi utamanya ditargetkan untuk pengguna ES5 dan sebelumnya.
Modul untuk memunculkan proses anak dengan Node.js didokumentasikan dengan baik dalam dokumentasi (v5.0.0). Untuk menjalankan perintah dan mengambil output lengkapnya sebagai buffer, gunakan
child_process.exec
:Jika Anda perlu menggunakan proses pegangan I / O dengan aliran, seperti ketika Anda mengharapkan sejumlah besar output, gunakan
child_process.spawn
:Jika Anda mengeksekusi file daripada perintah, Anda mungkin ingin menggunakan
child_process.execFile
, yang mana parameter yang hampir identikspawn
, tetapi memiliki parameter callback keempat sepertiexec
untuk mengambil buffer output. Itu mungkin terlihat sedikit seperti ini:Pada v0.11.12 , Node sekarang mendukung sinkron
spawn
danexec
. Semua metode yang dijelaskan di atas tidak sinkron, dan memiliki mitra sinkron. Dokumentasi untuk mereka dapat ditemukan di sini . Meskipun mereka berguna untuk skrip, perlu diketahui bahwa tidak seperti metode yang digunakan untuk menelurkan proses anak secara serempak, metode sinkron tidak mengembalikan turunan dariChildProcess
.sumber
child.pipe(dest)
(yang tidak ada), Anda harus menggunakanchild.stdout.pipe(dest)
danchild.stderr.pipe(dest)
, misalnyachild.stdout.pipe(process.stdout)
danchild.stderr.pipe(process.stderr)
.echo "hello"
danecho "world"
.Node JS
v13.9.0
, LTSv12.16.1
, danv10.19.0
--- Mar 2020Metode Async (Unix):
Metode Async (Windows):
Sinkronkan:
Dari Dokumentasi Node.js v13.9.0
Hal yang sama berlaku untuk Dokumentasi Node.js v12.16.1 dan Dokumentasi Node.js v10.19.0
sumber
'cmd', ['/c', 'dir']
. Setidaknya saya hanya mencari-cari alasan mengapa'dir'
tanpa argumen tidak berhasil sebelum saya mengingat ini ...;)Anda mencari child_process.exec
Berikut ini contohnya:
sumber
data
acara di stdout. Lihat di dokumen, tetapi pasti seperti ituchildProc.stdout.on("data", fn)
.sumber
Karena versi 4 alternatif terdekat adalah
child_process.execSync
metode:Perhatikan bahwa
execSync
panggilan memblokir loop peristiwa.sumber
child_process
sedang dibuat saat menggunakanexecSync
? Dan apakah itu dihapus setelah perintah, kan? Jadi tidak ada memori yang bocor?Jika Anda menginginkan sesuatu yang mirip dengan jawaban teratas tetapi juga sinkron maka ini akan berhasil.
sumber
Saya baru saja menulis pembantu Cli untuk menangani Unix / windows dengan mudah.
Javascript:
File sumber naskah asli:
sumber
Sekarang Anda dapat menggunakan shelljs (dari node v4) sebagai berikut:
sumber
Jika Anda tidak keberatan dengan ketergantungan dan ingin menggunakan janji,
child-process-promise
berfungsi:instalasi
exec Penggunaan
penggunaan bibit
sumber
Gunakan
npm
paket ringan ini :system-commands
Lihat di sini .
Impor seperti ini:
Jalankan perintah seperti ini:
sumber
@ Jawaban hexacyanide hampir lengkap. Pada perintah Windows
prince
bisaprince.exe
,prince.cmd
,prince.bat
atau hanyaprince
(aku tidak menyadari betapa permata dibundel, tapi sampah NPM datang dengan script sh dan batch script -npm
dannpm.cmd
). Jika Anda ingin menulis skrip portabel yang akan berjalan di Unix dan Windows, Anda harus menelurkan executable yang tepat.Berikut adalah fungsi spawn yang sederhana namun portabel:
sumber