NPM komut dosyalarını sırayla çalıştırma


150

Diyelim ki

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

Tüm bu komut dosyalarının sırayla başlatılmasına izin vermek için hangi NPM komutunu çalıştırabilirim. Ben ön / sonrası sabitleme kullandığınızda sırayla başlatmak ama yürütmeden önce üst komut dosyasının bitmesini beklemeyin. Tek çözüm gibi olduğunu varsayıyorum: Bir async.series yardımcı işlevi kabuk komutları ateş ederken Gulp görevlerini sıralı olarak ateş almak nasıl? ? Bunun Gulp ile yapılabileceğini biliyorum, ancak şimdilik yeteneklerini keşfetmek için NPM'ye bağlı kalmak istiyorum. Herhangi bir yardım için teşekkürler!


Alttaki cevap güncellendi
Tzach Ovadia

StartKomutun belgelerine göre, /waitparametreyi kullanabilmeniz gerekir (Uygulamayı
başlatın

Yanıtlar:


316

Bu komut dosyalarını npm çalıştırmasıyla çağırın ve çift ve işaretiyle zincirleyin &&:

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

Açıklama:

  • &&Sıralı yürütme için (çift ve işareti) kullanın .
  • &Paralel yürütme için (tek ve işareti) kullanın .

4
OP'de istendiği gibi previos bitene kadar her komutun yürütülmemesi nedeniyle, bu en iyi şekilde çalışır. Teşekkürler
Rice

20
&&kabuk tarafından değerlendirilir ve Windows üzerinde çalışmaz.
Bernhard Döbler

12
Bu kabul edilen cevap olmamalıdır. BernhardDöbler'e göre &&sözdizimi bir UNIX yapısıdır. Window makinelerinde yanlış bir şekilde davranacak ve oluşturma işleminiz için potansiyel sonuçları kıracaktır.
Rafe Goldberg

3
@RafeGoldberg && operatörü, hem pencerelerde hem de * nix ortamlarında aynı yürütme davranışına sahiptir, yani sıralı yürütme ... Hepimizin eksik olduğu bir şey olmadığı sürece?
Rice

3
@Rice oy vey; aptal olmak ve tek ve çift ve operatörlerimi karıştırmaktı. npm-run-allDokümanlar uyarınca : “bazen &birden fazla komutu paralel olarak çalıştırmak için kullanırız , ancak Windows ' cmd.exe... [bu operatörü] desteklemez.” Bu yüzden haklı görünüyorsunuz - en azından kısa araştırmamdan &&operatör mükemmel platformlar arası uyumlu görünüyor.
Rafe Goldberg

31

@ Mobiletainment'in harika cevabını takiben , komutu daha kısa ve daha okunabilir hale getirmek için npm-run-all komutunu da kullanabilirsiniz . Senin durumunda:

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

run-s, npm-run-allverilen tüm npm komut dosyalarını sırayla çalıştıran bir kısayoldur , dolayısıyla -s( run-sdaha kısa bir sürümüdür npm-run-all -s).


19

Bunları başka bir komut dosyasına dizebilirsiniz. "start": "pre-build && build_logic && post_build && exit"


2
Birbirlerinin bitmesini beklemelerini isterim, bunlar sırayla patlar, ancak beklemezler.
Pirinç

2
Bu bir düğüm / npm sorunu olduğunu sanmıyorum. startTeknik olarak pencerelerde yürütülüyor komut olan bitmiş. Dahili yöntem de bitene kadar uygulamayı açık kalmaya zorlamak için /waitile işaretini kullanın . startstart
dvlsg

Bunu test etmek için - start notepadbir komut isteminden çalıştırın , sonra orijinal komut istemine bir göz atın. Başka bir komut yazabilmeniz gerekir. Sonra koş start /wait notepad. startSenin not defteri penceresi (komut istemi yeniden bakmak) açıkken komut "run" devam etmelidir. Sonra bir kez not defteri kapatın, startbitmiş olacak.
dvlsg

\ Wait çözümü, çift ve işaretli veya ön / son sabit npm komutlarıyla eklenen komutlar için çalışmaz.
Pirinç

15

Eğer komut öneki preve postböylece otomatik olarak çalıştırır:

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

o zaman koş npm run build


Bu, soruda belirtildiği gibi çalışmaz: "Önceden / sonrası düzeltmeyi kullandığımda sıralı olarak başlatılırlar ancak yürütülmeden önce üst komut dosyasının bitmesini beklemezler."
Russell Chisholm

3

deneyebilirsin:


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

2

Birden fazla komutu birçok farklı şekilde birleştirmek için npm-run-all komutunu kullanabilirsiniz

Örneğin, ürününüzde aşağıdaki komut dosyaları varsa package.json:

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

Hepsini sıralı olarak şu şekilde çalıştırabilirsiniz:

$ npm-run-all clean lint build

Birden çok npm komutunu paralel olarak çalıştırma hakkında bu soruya bakın


1
Bu yol. npm-run-all en iyisidir. Ve bir paket üretecek. Çapraz platform olan json.
Robert
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.