Di saya, package.json
saya punya dua skrip ini:
"scripts": {
"start-watch": "nodemon run-babel index.js",
"wp-server": "webpack-dev-server",
}
Saya harus menjalankan 2 skrip ini secara paralel setiap kali saya mulai mengembangkan di Node.js. Hal pertama yang saya pikirkan adalah menambahkan skrip ketiga seperti ini:
"dev": "npm run start-watch && npm run wp-server"
... tapi itu akan menunggu start-watch
sampai selesai sebelum berjalan wp-server
.
Bagaimana saya bisa menjalankan ini secara paralel? Harap diingat bahwa saya perlu melihat output
perintah-perintah ini. Juga, jika solusi Anda melibatkan alat bangun, saya lebih suka menggunakan gulp
daripada grunt
karena saya sudah menggunakannya di proyek lain.
javascript
node.js
build
André Pena
sumber
sumber
&&
akan menjalankan skrip Anda secara berurutan sementara&
akan menjalankannya secara paralel .npm run start-watch & npm run wp-server
. Ini akan menjalankan perintah pertama sebagai utas latar. Ini bekerja dengan sangat baik ketika salah satu perintah tidak berjalan lama dan tidak perlu keluar secara manual nanti. Sesuatu seperticoncurrently
memungkinkan Anda untuk membunuh semua utas secara bersamaan dengan CTRL-C.Jawaban:
Gunakan paket yang disebut bersamaan .
npm i concurrently --save-dev
Kemudian atur
npm run dev
tugas Anda seperti itu:sumber
node ./node_modules/concurrently/src/main.js
tidak dibutuhkan.concurrent
akan berfungsi dengan baik dalam skrip karena modul menginstal bin to./node_modules/.bin/concurrent
concurrently
menggunakan beberapa stream yang berantakan dengan output konsol (warna mungkin aneh, kursor hilang) sedangkanparallelshell
tidak memiliki masalah itu .--raw
mode untuk mempertahankan warna dalam output.Jika Anda menggunakan lingkungan seperti UNIX, cukup gunakan
&
sebagai pemisah:Kalau tidak, jika Anda tertarik pada solusi lintas platform, Anda bisa menggunakan modul npm-run-all :
sumber
a && b
dimulaib
setelaha
selesai dengan sukses, tetapi nodemon tidak pernah berhenti tanpa kesalahan, sehingga tidak bisa berfungsi.a & b
dimulaia
, pindahkan ke latar belakang danb
langsung mulai . Menang!a | b
pipa stdouta
ke ke stdinb
yang membutuhkan keduanya berjalan secara bersamaan. Meskipun ini tampaknya memiliki efek yang diinginkan, Anda tidak boleh menggunakannya di sini.&
adalah ide yang sangat buruk karena menghalangi proses. Ini berarti bahwanpm
tidak akan menjadi proses induk lagi. Anda akan berakhir dengan zombienpm run start-watch
yang tidak akan dibunuhctrl-c
.wait
untuk mengurangi masalah dengan proses gantung:"dev": "npm run start-watch & npm run wp-server & wait"
&
pada unix mencegah perintah menanggapi Cc / Cz dan juga mencegah kode kembali dari merambat jika terjadi kegagalan.Dari windows cmd Anda dapat menggunakan
start
:Setiap perintah yang diluncurkan dengan cara ini dimulai di jendela sendiri.
sumber
&&
menunggu perintah pertama selesai sebelum memulai perintah kedua dan tugas pengamat tidak akan pernah selesai.Anda harus menggunakan npm-run-all (atau
concurrently
,parallelshell
), karena ia memiliki kontrol lebih besar untuk memulai dan mematikan perintah. Operator&
,|
adalah ide buruk karena Anda harus menghentikannya secara manual setelah semua tes selesai.Ini adalah contoh untuk pengujian busur derajat melalui npm:
-p
= Jalankan perintah secara paralel.-r
= Bunuh semua perintah ketika salah satu dari mereka selesai dengan kode keluar nol.Menjalankan
npm run test
akan memulai driver Selenium, mulai server http (untuk melayani file Anda) dan menjalankan tes busur derajat. Setelah semua tes selesai, itu akan menutup server http dan driver selenium.sumber
gulp
dangulp-sync
?Anda dapat menggunakan satu
&
untuk skrip run paralelTautan referensi
sumber
Solusi yang lebih baik adalah menggunakan
&
sumber
&
berfungsi pada Windows, tetapi bekerja secara berbeda. Pada OSX, itu akan menjalankan kedua perintah secara bersamaan, tetapi pada Windows, itu akan menjalankan perintah pertama, dan setelah perintah pertama ada, itu akan menjalankan perintah kedua.Saya sudah memeriksa hampir semua solusi dari atas dan hanya dengan npm-run-semua saya bisa menyelesaikan semua masalah. Keuntungan utama dari semua solusi lainnya adalah kemampuan untuk menjalankan skrip dengan argumen .
Ini memungkinkan saya untuk menjalankan perintah dengan argumen seperti
npm run test:watch -- Something
.EDIT:
Ada satu opsi lagi yang bermanfaat untuk
npm-run-all
:Tambahkan
-r
kenpm-run-all
skrip Anda untuk mematikan semua proses ketika satu selesai dengan kode0
. Ini sangat berguna ketika Anda menjalankan server HTTP dan skrip lain yang menggunakan server.sumber
Saya punya solusi lintas platform tanpa modul tambahan . Saya sedang mencari sesuatu seperti try catch block yang bisa saya gunakan di cmd.exe dan di bash.
Solusinya adalah
command1 || command2
yang tampaknya bekerja di kedua lingkungan yang sama. Jadi solusi untuk OP adalah:Maka sederhana
npm start
(dannpm run dev
) akan bekerja di semua platform!sumber
Jika Anda mengganti ampersand ganda dengan ampersand tunggal, skrip akan berjalan bersamaan.
sumber
Solusi Cepat
Dalam hal ini, saya akan mengatakan taruhan terbaikJika skrip ini adalah untuk modul pribadi yang dimaksudkan untuk berjalan hanya pada mesin berbasis * nix , Anda dapat menggunakan operator kontrol untuk proses forking, yang terlihat seperti ini:&
Contoh melakukan ini dalam file package.json parsial:
Anda kemudian akan menjalankan keduanya secara paralel melalui
npm run serve-bundle
. Anda dapat meningkatkan skrip untuk menampilkan pids dari proses bercabang menjadi file seperti ini:Google sesuatu seperti operator kontrol bash untuk forking untuk mempelajari lebih lanjut tentang cara kerjanya. Saya juga telah memberikan beberapa konteks lebih lanjut tentang memanfaatkan teknik Unix dalam proyek Node di bawah ini:
Konteks Lebih Lanjut RE: Unix Tools & Node.js
Jika Anda tidak menggunakan Windows, alat / teknik Unix sering bekerja dengan baik untuk mencapai sesuatu dengan skrip Node karena:
Modul untuk tugas sistem di Nodeland juga sering merupakan abstraksi atau perkiraan alat Unix, dari
fs
hinggastreams
.sumber
&
operator tidak didukung di Windows.edit:
Anda harus menginstal npm-run-all terlebih dahulu. Periksa juga halaman ini untuk skenario penggunaan lainnya.
sumber
Bagaimana dengan forking
Pilihan lain untuk menjalankan beberapa skrip Node adalah dengan skrip Node tunggal, yang dapat memotong banyak yang lain. Forking didukung secara native di Node, sehingga tidak menambah ketergantungan dan bersifat lintas-platform.
Contoh minimal
Ini hanya akan menjalankan skrip apa adanya dan menganggap skrip tersebut berada di direktori skrip induk.
Contoh verbose
Ini akan menjalankan skrip dengan argumen dan dikonfigurasi oleh banyak opsi yang tersedia.
Berkomunikasi dengan skrip bercabang dua
Forking juga memiliki manfaat tambahan bahwa skrip induk dapat menerima acara dari proses anak bercabang ulang serta mengirim kembali. Contoh umum adalah skrip induk untuk membunuh anak-anak bercabang dua.
Untuk acara dan metode lainnya yang tersedia, lihat
ChildProcess
dokumentasisumber
Saya mengalami masalah dengan
&
dan|
, yang keluar status dan kesalahan melempar, masing-masing.Solusi lain ingin menjalankan tugas apa pun dengan nama yang diberikan, seperti npm-run-all, yang bukan kasus penggunaan saya.
Jadi saya membuat npm-run-parallel yang menjalankan skrip npm secara asinkron dan melaporkan kembali ketika sudah selesai.
Jadi, untuk skrip Anda, itu akan menjadi:
npm-run-parallel wp-server start-watch
sumber
Dalam kasus saya, saya memiliki dua proyek, satu adalah UI dan yang lainnya adalah API , dan keduanya memiliki skrip masing-masing
package.json
file .Jadi, inilah yang saya lakukan.
sumber
node app
) dan API (Angular dalam src subfolder , tebakcd src/ng serve
), hanya bagian pertama yang berfungsi. Sebagai contohnode app& cd src& ng serve
.package.json:
Info lebih lanjut: https://github.com/mysticatea/npm-run-all/blob/master/docs/npm-run-all.md
sumber
Saya telah menggunakan npm-run-all untuk beberapa waktu, tetapi saya tidak pernah cocok dengannya, karena output dari perintah dalam mode menonton tidak bekerja dengan baik bersama-sama. Misalnya, jika saya memulai
create-react-app
danjest
dalam mode tontonan, saya hanya akan dapat melihat output dari perintah terakhir yang saya jalankan. Jadi sebagian besar waktu, saya menjalankan semua perintah saya secara manual ...Inilah sebabnya, saya mengimplementasikan lib saya sendiri, run-screen . Ini masih proyek yang sangat muda (dari kemarin: p) tetapi mungkin layak untuk melihatnya, dalam kasus Anda itu akan menjadi:
Kemudian Anda menekan tombol angka
1
untuk melihat outputwp-server
dan tekan0
untuk melihat outputstart-watch
.sumber
Solusi saya mirip dengan Piittis, meskipun saya punya beberapa masalah dalam menggunakan Windows. Jadi saya harus memvalidasi untuk win32.
sumber
Script simpul sederhana untuk membuat Anda pergi tanpa terlalu banyak kesulitan. Menggunakan readline untuk menggabungkan output sehingga garis tidak rusak.
sumber
ini bekerja di windows
sumber