メモログ

⛰ 塵が積もって山とならないメモのログ 👄

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の対象から外すようにしています。もっと良い方法があるかもしれませんけど、今のところはこれで。