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!


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.

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).


19

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


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


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"
},

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


1
Ini cara untuk pergi. npm-run-all adalah yang terbaik. Dan akan menghasilkan package.json yaitu cross-platform.
— Robert
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.