🦪

Windows環境でnpm-scripts実行に使用するシェルを変更する

2023/08/14に公開

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 setscript-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 を導入して解決する手段もあるらしい。環境毎に条件分岐させたい場合などには、これ使うのが良いかもしれない。
https://www.npmjs.com/package/cross-env

知らんけど。

Discussion