Windows環境でnpm-scripts実行に使用するシェルを変更する
npm run実行時の構文エラー
普段Mac環境で開発しているNext.jsプロジェクトをWindows環境で動かそうとしたところ、npm run dev
実行時に構文エラーが発生した。
'PORT' は、内部コマンドまたは外部コマンド、
操作可能なプログラムまたはバッチ ファイルとして認識されていません。
コマンドはgit-bash上で実行しており、該当箇所のpackage.jsonでは以下のようなポート番号を指定する環境変数を記述している。
"scripts": {
"dev": "PORT=15000 NODE_OPTIONS='--inspect' next dev",
原因
どうやらWindows環境ではnpm-scripts実行時、cmd(コマンド プロンプト)を使用する形となっているため、UNIX系の記述方式では構文エラーが出る模様。
$ npm config get shell
C:\Windows\system32\cmd.exe
$ npm config get script-shell
null
調べてみると、npm-scriptsが実行されるシェルはプラットフォームに依存することが判明した。
The actual shell your script is run within is platform dependent. By default, on Unix-like systems it is the /bin/sh command, on Windows it is cmd.exe. The actual shell referred to by /bin/sh also depends on the system. You can customize the shell with the script-shell config.
npm-run-script | npm Docs
検証
package.json
の環境変数の設定記述(構文エラーになっている箇所)をcmdが解釈できるよう書き換えてみる。
"dev": "PORT=15000 NODE_OPTIONS='--inspect' next dev",
↓
"dev": "set PORT=15000 NODE_OPTIONS=--inspect && next dev",
確かにこれで npm run dev
実行時に構文エラーが出なくなり、プロジェクトが正常起動できた。
npm-scriptsの実行シェルをgit-bashに変更する
前述の記述変更でも構文エラーは解消できるが、普段git-bash上でコマンド操作を行っているため、npm-scripts実行時に使用されるdefaultシェルもgit-bashに合わせることにした。
npm config set
の script-shell
で使用するシェルの指定可能。
script-shell
- Default: null
- Type: path
The shell to use for scripts run with the npm run command.
script-shell - npm Documentation
git-bashの本体が置かれているパスを指定する。
$ npm config set script-shell "C:\\Program Files\\git\\bin\\bash.exe"
$ npm config get script-shell
C:\Program Files\git\bin\bash.exe
これでpackage.json
の記述はMac環境と同様のまま npm run dev
が実行できるようになった。
補足
ちなみに cross-env
を導入して解決する手段もあるらしい。環境毎に条件分岐させたい場合などには、これ使うのが良いかもしれない。
知らんけど。
Discussion