web-dev-qa-db-ja.com

Windowsでnpm run-scriptsのシェルを設定する方法

私はWindowsでnpmを実行していますが、実行スクリプトで並列操作を使用してスタイルを設定したいのですが、cmdで並列実行するのはpackage.jsonファイルでは面倒です

scripts: { "go": "cmd1 & cmd2"} 

しかし、npmは;を知らないcmd.exeの下でスクリプトを実行します。これをスクリプトに変更できます:{ "go": "bats/bat1.bat")コマンドを並行して実行します。これは動作しますが、Windowsでのみ動作するスクリプトを提供します

npmでbashクローンまたはcygwinの下でスクリプトを実行できれば、config: { "Shell": "bash"}を試しましたが、それでもcmd.exeを実行できました。

特定のシェル(cmd.exeではない)を使用してnpmに実行スクリプトを伝える方法はありますか?

54
user2129444

Npm 5.1以降

npm config set script-Shell "C:\\Program Files (x86)\\git\\bin\\bash.exe"  

または(64bitインストール)

npm config set script-Shell "C:\\Program Files\\git\\bin\\bash.exe"

git for windows installedが必要なことに注意してください

次のコマンドを実行して元に戻すことができます。

npm config delete script-Shell
83
DuncanSungWKim

これを行う1つの方法を次に示します。

  1. プロジェクトのbinディレクトリにmy_script.shなどのスクリプトを作成します。
  2. Package.jsonファイルに、bashを使用してスクリプトを実行する行を追加します。例えば:

    "scripts": {
      "boogie": "bash bin/my_script.sh"
    }
    

これで、次の方法でnpmからbashスクリプトを実行できます。

    npm run-script boogie

あまりエレガントではありませんが、機能します。

WindowsとLinux/Unixの両方で開発している場合、少なくともこのアプローチは両方の環境にかなり移植可能です。

23
Craig Johannsen

理想的には、npm Shell configパラメーターのオーバーライドは機能するはずですが、Windowsではnpm(少なくともバージョン1.4.14)は設定を無視して、代わりにcmd.exeを使用するようです。

BashまたはGit Bashシェルで次のコマンドを使用して、シェル設定を確認します。

$ npm config ls -l | grep Shell

デフォルトでは、出力は次のようになります。

Shell = "C:\\WINDOWS\\system32\\cmd.exe"

ただし、デフォルトのシェルパラメータを上書きするには、npmrcファイルを\ Users\yourusername\AppData\Roaming\npm\etcディレクトリに追加(または編集)できます。次の行を追加するだけです。

Shell = "C:\\Program Files (x86)\\git\\bin\\bash.exe"

使用するパスは、bash.exeへの任意の有効なパスにすることができます。ここで、上記の「npm config ls -l | grep Shell」コマンドを実行すると、次の出力が表示され、Shellパラメーターがオーバーライドされたことを示します。

Shell = "C:\\Program Files (x86)\\git\\bin\\bash.exe"
; Shell = "C:\\WINDOWS\\system32\\cmd.exe" (overridden)

いつか、おそらく、npmの新しいバージョンが、上書きされたShellパラメーターに注意を払うでしょう。

14
Craig Johannsen

cMDの方法を使用して.bat

"scripts": {
    "start": "react-scripts start",
    "build": "react-scripts build",
    "test": "react-scripts test --env=jsdom",
    "eject": "react-scripts eject",
    "app": "cd build & browser-sync start --server --files 'index.html'",
    "bat": "start start-browser.bat",
    "starts": "start http://localhost:7777/datas/ && start http://localhost:7777/Info/"
},
start http://localhost:7777/datas/ && start http://localhost:7777/Info/
1
user8202629

この目的のために特別に作成されたnode_moduleを使用します。 npm-run-all を使用することをお勧めしますが、 parallelshell などの others が存在します。

質問のドロップイン交換のParallelshellの例を以下に示します。

"scripts": {
    "parallelexample1": "parallelshell \"echo 1\" \"echo 2\" \"echo 3\""
},

次のコマンド:

npm run parallelexample1

windowsとUNIX(Linux/MacOS)の両方で動作します。

興味深いことに、npm-run-allはシェルコマンドをサポートしていません。したがって、すべてのシェルコマンドを以下のようなスクリプトに分ける必要があります。

"scripts": {
   "parallelexample2": "npm-run-all echo*",
    "echo1": "echo 1",
    "echo2": "echo 2",
    "echo3": "echo 3"
},

次のコマンド:

npm run parallelexample2

windowsとUNIX(Linux/MacOS)の両方で動作します。

1
Atilla Ozgur