メモログ

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

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で簡潔に解説されています。

1
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をインストールしていると、

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

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

1
2
3
4
5
require('matchdep').filterDev('grunt-*').forEach(function (name) {
if (!/template/.test(name)) {
grunt.loadNpmTasks(name);
}
});

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