別に $ npm install -g gulp しなくても大丈夫って話。

$ npm install -g gulp-cli

みたいにグローバルにモジュールをインストールさせる風潮ってどうなんだよ!みたいな話をしてまして。

僕自身もいろいろそれには非常に違和感を持っていたり、そもそも node.js のバージョンを変更したときとか、グローバルに入っているモジュールの面倒も見ないといけないことが非常に面倒くさいんですよね。grunt-cli も gulp-cli も bower も入れたくないし、可能な限りプロジェクトの node_modules で完結させたいんですよね。バージョンアップとかも面倒ですし。

そんなわけで、いろいろ試してみたんですが、

$ ./node_modules/.bin/gulp hoge

とかやるのは、実際面倒くさいし、現在のディレクトリの位置次第で変わったり。

$ $(npm bin)/gulp hoge

とかやるのも最初の奴よりはマシですが、面倒。bashrcとかを使って、./node_modules/.bin にパスを・・・というのは流石に論外。Windows の人はどうすんねんとか言い出すとキリは無いわけで。

というわけでいろいろ試してみたんですが、どうやら npm 2系以上からは、npm scripts にサブコマンドを渡せるようになっていたようです。だいぶ前から出来たんですね…

つまりどういうことかというと、package.json の “scripts” のところに、以下のように書いておきます。

{
  "scripts": {
    "gulp": "gulp"
  }
}

そうすると、以下のコマンドで gulp を走らせることが出来ます。

$ npm run gulp

そして、それに加えて、gulp で定義したサブコマンドなども渡せるようです。

$ npm run gulp build

grunt 等の他のタスクランナーなどでも同等のことは出来るはずです。これで面倒くさいグローバルなモジュールの管理をしなくて済みますね!!! バージョンの不整合などに悩まされる心配も無さそうです。

とりあえず、gulp をお使いの皆さんは今すぐ package.json に1行足しましょう。

npm scripts を使うと、npm install したあとに勝手に CSS や JS をビルドしたりいろいろ便利なことが出来るので面白いですよー。

参考: npm で依存もタスクも一元化する – Qiita

コメント欄の議論も含めてなかなか濃いですね。