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