NPMスクリプトを順次実行する


150

私が持っているとしましょう

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

これらのスクリプトをすべて順番に起動させるために実行できるNPMコマンドはどれですか。私は事前/事後修正を使用すると、順次起動しますが、実行する前に親スクリプトが完了するのを待ちません。唯一の解決策が次のようなものであると想定しています:async.seriesヘルパー関数でシェルコマンドを実行するときにGulpタスクを順次実行するにはどうすればよいですか??これはGulpで実行できることはわかっていますが、今のところNPMを使用してその機能を探っていきたいです。助けてくれてありがとう!


下部にある回答の更新
Tzach Ovadia

Startコマンドのドキュメントによると、/waitパラメーターを使用できるはずです(アプリケーションを起動し、終了するまで待ちます)
Tzach Ovadia

回答:


316

npm runを介してこれらのスクリプトを呼び出し、2つのアンパサンドでチェーンします&&

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

説明:

  • &&順次実行には(二重アンパーサンド)を使用します。
  • &並列実行には(単一のアンパサンド)を使用します。

4
これは、OPで要求されているように、前の手順が完了するまで各コマンドが実行されないため、順番に実行されるため、最適に機能します。ありがとう
ライス

20
&&シェルによって評価され、Windowsでは機能しません。
BernhardDöbler、2018年

12
これは受け入れられる答えではありません。@BernhardDöblerによると、&&構文はUNIX構成です。ウィンドウのマシンでは正しく動作せず、ビルドプロセスに重大な影響を与える可能性があります。
Rafe Goldberg

3
@RafeGoldberg &&演算子は、ウィンドウ環境と* nix環境の両方で同じ実行動作、つまり順次実行を実行します。

3
@Rice oy vey; ばかげていて、シングルとダブルのアンパサンド演算子を混同していた。npm-run-allドキュメントによれば、「&複数のコマンドを並行して実行するために使用することがありますが、Windowsのcmd.exe...は[この演算子]をサポートしていません。」したがって、あなたが正しかった&&ように思われます—少なくとも私の簡単な調査から、オペレーターは完全にクロスプラットフォーム互換であるようです。
Rafe Goldberg

31

@Mobiletainmentのすばらしい回答に続いて、npm-run-allを使用してコマンドをはるかに短く、読みやすくすることもできます。あなたの場合:

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

run-sは、npm-run-all指定されたすべてのnpm-scriptを順番に実行するショートカットであるため、-srun-sはの短縮バージョンですnpm-run-all -s)。


19

それらを別のスクリプトに文字列化することもできます。 "start": "pre-build && build_logic && post_build && exit"


2
私は彼らにお互いが終わるのを待つように要求します、これらは順番に発火しますが、待ちません。

2
これはノード/ npmの問題ではないと思います。startWindowsで実行されているコマンドは、技術的である、完成。/waitフラグを使用して、内部メソッドも終了するまでアプリケーションstartを強制的にstart開いたままにします。
dvlsg

これをテストするにstart notepadは、コマンドプロンプトから実行し、元のコマンドプロンプトを確認します。別のコマンドを入力できるはずです。次にを実行しstart /wait notepadます。startあなたのメモ帳ウィンドウが(コマンドプロンプトもう一度見てみましょう)開いている間のコマンドは、「実行」を継続すべきです。その後、メモ帳を閉じるstartと、終了します。
dvlsg

\ waitソリューションは、二重アンパサンドまたは前置/後置固定npmコマンドを介して追加されたコマンドに対しては機能しません。
ライス

15

あなたのスクリプトの前に付けることができますpreし、postそう、彼らは自動的に実行されます:

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

次に実行します npm run build


質問に示されているように、これは機能しません:「事前/事後修正を使用すると、それらは順番に起動しますが、親スクリプトが完了するのを待たずに実行されます。」
ラッセルチザム

3

あなたが試すことができます:


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

2

npm-run-allを使用して、さまざまな方法で複数のコマンドを組み合わせることができます

たとえば、次のスクリプトが含まれている場合package.json

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

次のように、すべてを順番に実行できます。

$ npm-run-all clean lint build

複数のnpmコマンドを並行して実行する方法については、この質問を参照してください


1
これが方法です。npm-run-allが最適です。そして、クロスプラットフォームであるpackage.jsonを生成します。
ロバート
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.