gulp とかを使っているプロジェクトの場合、ビルドツール類も devDependencies
に含めてバージョンを固定したいという要求があると思う。
ところが実行ファイルにパスを手軽に通したいという理由のみで npm install -g gulp
などしてしまうとバージョンが固定できなくなってしまい、本末転倒である。
とはいえ ./node_modules/.bin/gulp build
してくれ、というのも面倒であるので、どうするとよいのか書いておく。
node_modules/.bin に自動でパスを通す
たとえば direnv を使う。
# .envrc export PATH="$(npm bin):$PATH"
direnv allow
.envrc は作業ディレクトリを移動した時に評価されるので、npm bin
の出力が異なる環境でもそれぞれうまく動く (はず) なのでリポジトリに含めてもよい。
package.json の scripts フィールドを使う
package.json の scripts
フィールドに定義したタスクは npm run NAME
で実行できる。
また、この scripts
フィールドに定義したタスクの実行時には node_modules/.bin
にパスを通した上で実行される。
In addition to the shell's pre-existing PATH, npm run adds node_modules/.bin to the PATH provided to scripts.
run-script | npm Documentation
統一されたインターフェースを用意するという意味でも scripts
フィールドは望ましい。
結論
direnv と scripts フィールドは役割が少し異なるので、どちらか一方のみを利用するということもなく両方活用できるとよさそうですね。