Menjalankan skrip NPM secara berurutan

150

Katakanlah saya punya

"scripts": {
    "pre-build": "echo \"Welcome\" && exit 1",
    "build_logic": "start cmd.exe @cmd /k \"yo esri-appbuilder-js:widget && exit 1\"",
    "post_build":  "start C:\\WebAppBuilderForArcGIS\\startupShortcut",
    "exit" : "start cmd.exe @cmd /k \"echo \"goodbye\" && exit 1\""
  },

Apa perintah NPM yang bisa saya jalankan untuk membiarkan semua skrip ini diluncurkan secara berurutan. Ketika saya menggunakan pra / post fixing mereka diluncurkan secara berurutan tetapi mereka tidak menunggu skrip induk selesai sebelum dijalankan. Saya mengasumsikan satu-satunya solusi adalah seperti: Bagaimana cara saya mendapatkan tugas Gulp untuk memecat secara berurutan ketika menjalankan perintah shell dalam fungsi helper async.series? ? Saya tahu ini bisa dilakukan dengan Gulp tetapi saya ingin tetap menggunakan NPM untuk saat ini untuk mengeksplorasi kemampuannya. Terima kasih atas bantuannya!

Nasi
sumber
Jawaban yang diperbarui di bagian bawah
Tzach Ovadia
Menurut dokumentasi Startperintah, Anda harus dapat menggunakan /waitparameter (Mulai aplikasi dan tunggu sampai diakhiri)
Tzach Ovadia

Jawaban:

316

Aktifkan skrip ini melalui npm run dan rangkai dengan double ampersand &&:

npm run pre-build && npm run build_logic && npm run post_build && npm run exit

Penjelasan:

  • Gunakan &&(amper ganda) untuk eksekusi berurutan.
  • Gunakan &(single ampersand) untuk eksekusi paralel.
Mobiletainment
sumber
4
Ini berfungsi paling baik karena dieksekusi secara berurutan, karena setiap perintah tidak dieksekusi sampai previos selesai, seperti yang diminta dalam OP. Terima kasih
Beras
20
&&dievaluasi oleh shell dan tidak berfungsi di Windows.
Bernhard Döbler
12
Ini seharusnya bukan jawaban yang diterima. Per @ BernhardDöbler, &&sintaksnya adalah konstruk UNIX. Ini akan berperilaku salah pada mesin Window, dengan konsekuensi berpotensi melanggar untuk proses membangun Anda.
Rafe Goldberg
3
@RafeGoldberg Operator && memiliki perilaku eksekusi yang sama di lingkungan windows dan * nix, yaitu eksekusi berurutan..Kecuali ada sesuatu yang kita semua lewatkan?
Beras
3
@Rice oy vey; sedang bodoh dan mencampur operator single dan double-ampersand saya. Per npm-run-alldokumen: "kadang-kadang kita gunakan &untuk menjalankan beberapa perintah secara paralel, tetapi Windows cmd.exe... tidak mendukung [operator ini]." Jadi sepertinya Anda benar - setidaknya dari riset singkat saya, &&operator tampaknya sangat kompatibel lintas platform.
Rafe Goldberg
31

Mengikuti jawaban hebat @ Mobiletainment , Anda juga dapat menggunakan npm-run-all untuk membuat perintah lebih pendek dan lebih mudah dibaca. Dalam kasus Anda:

"scripts": {
    ...
    "build": "run-s pre-build build_logic post_build exit"
}

run-sadalah pintasan yang npm-run-allmenyediakan, yang menjalankan semua skrip npm yang diberikan secara berurutan, karenanya -s( run-sadalah versi yang lebih pendek npm-run-all -s).

Atau A.
sumber
19

Anda bisa merangkai mereka ke skrip lain. "start": "pre-build && build_logic && post_build && exit"

Dave V
sumber
2
Saya akan meminta mereka untuk menunggu satu sama lain untuk menyelesaikan, ini akan menyala secara berurutan tetapi tidak akan menunggu.
Beras
2
Saya tidak berpikir ini adalah masalah node / npm. The startperintah Anda menjalankan di windows teknis adalah selesai. Gunakan /waitbendera dengan startuntuk memaksa startaplikasi tetap terbuka sampai metode internal juga selesai.
dvlsg
Untuk menguji ini - jalankan start notepaddari prompt perintah, lalu lihat prompt perintah asli. Anda harus bisa mengetikkan perintah lain. Kemudian jalankan start /wait notepad. The startperintah harus terus "run" sementara jendela notepad Anda terbuka (lihat perintah lagi prompt). Maka setelah Anda menutup notepad, startakan selesai.
dvlsg
Solusi \ wait tidak berfungsi untuk perintah-perintah yang ditambahkan melalui perintah double ampersand atau pre / post fixed npm.
Beras
15

Anda dapat awalan script Anda predan postsehingga mereka akan mengeksekusi secara otomatis:

"scripts": {
  "prebuild": "echo \"Welcome\" && exit 1",
  "build": "start cmd.exe @cmd /k \"yo esri-appbuilder-js:widget && exit 1\"",
  "postbuild":  "start C:\\WebAppBuilderForArcGIS\\startupShortcut",
  "exit" : "start cmd.exe @cmd /k \"echo \"goodbye\" && exit 1\""
}

lalu lari npm run build

Tzach Ovadia
sumber
ini tidak berfungsi, seperti yang ditunjukkan dalam pertanyaan: "Ketika saya menggunakan pra / post fixing, mereka memulai secara berurutan tetapi mereka tidak menunggu skrip induk selesai sebelum dieksekusi."
Russell Chisholm
3

Anda dapat mencoba:


"scripts": {
  "clean-dist": "rm -f ./dist/*.js && rm -f ./dist/*.map",
  "build": "npm run clean-dist && parcel build ./packages/index.html"
},
Muhammed Moussa
sumber
2

Anda dapat menggunakan npm-run-all untuk menggabungkan beberapa perintah dalam banyak cara berbeda

Misalnya, jika Anda memiliki skrip berikut di package.json:

"scripts": {
    "clean": "rimraf dist",
    "lint":  "eslint src",
    "build": "babel src -o lib"
}

Anda dapat menjalankan semuanya secara berurutan seperti ini:

$ npm-run-all clean lint build

Lihat pertanyaan ini untuk cara menjalankan beberapa perintah npm secara paralel

KyleMit
sumber
1
Ini cara untuk pergi. npm-run-all adalah yang terbaik. Dan akan menghasilkan package.json yaitu cross-platform.
Robert