メモログ

matchdepを使ってgrunt.loadNpmTasksする

matchdep を使用して grunt.loadNpmTasks を毎回記述しないで済むようにするという話。npm install --save-dev でインストールした grunt plugin を Grunt で使用する場合、Gruntfile.js でgrunt.loadNpmTasksを使ってタスクの load をする必要があります。

しかし、grunt plugin を追加するたびに grunt.loadNpmTasks を Gruntfile に追加するのはわずらわしいし、お試しで追加した plugin とか使わなくなった plugin を削除するときに loadNpmTasks をいちいち除かないといけないのもまた面倒くさい。

ので、matchdepを使用する。matchdep についてはmatchdep を使って Grunt.js のプラグインを自動ロードする | Re* Programmingで簡潔に解説されています。

require("matchdep").filterDev("grunt-*").forEach(grunt.loadNpmTasks);

上記のように設定すると、package.json の devDependencies から、マッチングした対象の名前を返してくれます。そして forEach で grunt.loadNpmTasks に渡すと。devDependencies に grunt plugin を追加すれば、loadNpmTasks を Gruntfile に記述しなくても、task を load してくれるようになります。

ただ、grunt-template-jasmine-requirejsのように、task のない grunt plugin をインストールしていると、

>> Local Npm module "grunt-template-jasmine-requirejs" not found. Is it installed?

という warning が発生するので、個人的には

require("matchdep")
  .filterDev("grunt-*")
  .forEach(function (name) {
    if (!/template/.test(name)) {
      grunt.loadNpmTasks(name);
    }
  });

という感じで、名前に template がある場合は、task はないだろうということにして、loadNpmTasks の対象から外すようにしています。もっと良い方法があるかもしれませんけど、今のところはこれで。

私について

Yutaka Yamaguchi
東京在住。TypeScript, Node.js, Reactなどフロンエンドが主力。Perlも書く。SwiftやRubyも過去には使ってた。過去のTOEIC 860くらい。