npm install -g gulp とかしない流儀

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.jsonscripts フィールドに定義したタスクは 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 フィールドは役割が少し異なるので、どちらか一方のみを利用するということもなく両方活用できるとよさそうですね。