Gruntタスクの自動読み込み

GruntでいちいちloadNpmTasks()しなくて済むようになるload-grunt-tasksパッケージは便利だけど、そもそもこれをインストールするのが面倒くさい。インストールしたGruntタスクはpackage.jsondevDependenciesに必ず書いてあり、Gruntfile.js内ではどこでもそれを利用することが可能なので、grunt-で始まるNodeパッケージだけを自動でloadNpmTasks()するようなコードを書くと簡単に自動読み込みを実装できる。

'use strict';

module.exports = function (grunt) {
  grunt.initConfig({
    pkg: grunt.file.readJSON('package.json')
  });

  for (var devDependency in grunt.config.data.pkg.devDependencies) {
    if (devDependency.match(/^grunt-/)) {
      grunt.loadNpmTasks(devDependency);
    }
  }
};

Gruntfile.jsではサンプル・コードでもそうなっているようにpackage.jsonの中身を読み込ませることが多い。これは主にGruntタスクの設定においてテンプレートを使ってプロジェクト名やバージョン番号などを参照できるようにする目的でそうする。こうして読み込んだpackage.jsonの中身はgrunt.config.data以下に保存されるので、実際はどこからでも参照できる。ので上記のようにfor...inなどを使って調べつつ、grunt-で始まるならloadNpmTasks()を呼ぶだけ。

一度書いたら終わりという点ではload-grunt-tasksとほぼ同じで、起動コストという点ではこの5行のコードが勝るけど、保守性という点ではload-grunt-tasksの方が良い。ので、複数人が触るようなプロジェクトではload-grunt-taskの方が良さそう。


load-grunt-tasksは確かに便利だけど、僕はわざわざNodeパッケージを別途インストールする程ではないという感じ。また、できればちゃんと個別にロードした方が良いとも考えてて、実際にこういったコードでやるのは、頻繁にGruntプラグインを入れ替える実験的な性格の強いプロジェクトでだけ。