grunt-task-helperというGruntプラグインを使っている。ざっと言うとsrc
とdest
を比較してフィルターをかけた結果を他のタスクで使えるようになったりするもの。例えばビルトインの比較機能であるnewFile
を使うと、更新されたファイルがあった場合にだけ走るタスクと似たようなものが簡単に作れる。
grunt-contrib-concatを使っているとして、そのタスク設定が以下のようになっているとする。
concat: {
options: {
seperator: ';'
},
prettify: {
src: [
'scripts/prettify/prettify.js',
'scripts/prettify/lang-config.js',
'scripts/prettify/lang-css.js',
'scripts/prettify/lang-scss.js',
'scripts/prettify/lang-vim.js',
'scripts/prettify/prettify-loader.js'
],
dest: 'scripts/prettify.js'
}
}
この場合は順番が重要なのでグロブでまとめて拾っていない以外は普通なマルチタスク設定。これをgrunt-task-helperを挟むように書きかえるとこうなる。
concat: {
options: {
seperator: ';'
},
prettify: {
files: '<%= taskHelper.prettify.options.filesArray %>'
}
},
taskHelper: {
prettify: {
options: {
handlerByFile: 'newFile',
filesArray: []
},
src: [
'scripts/prettify/prettify.js',
'scripts/prettify/lang-config.js',
'scripts/prettify/lang-css.js',
'scripts/prettify/lang-scss.js',
'scripts/prettify/lang-vim.js',
'scripts/prettify/loader.js'
],
dest: 'scripts/prettify.js'
}
}
src
とdest
をtaskHelperタスクに移して、concatタスクのfiles
でテンプレートを使ってフィルター結果が格納されるfilesArray
を参照してやる。ここではビルトインのnewFile
を使っていて、src
に指定されたファイルのうちひとつでもdest
で指定されたファイルより新しい場合にのみfilesArray
にsrc
とdest
がコピーされる。そうでない場合は空になるのでconcatタスクは何もせず完走する(エラーにはならない)。
比較に使ったnewFile
の代わりにサイズで比較するsize
を使うこともできるし、自前でfalse
を返して除外していく関数を書いたりもできる。自前で色々やると誰にも読めなくなるGruntfile.js
の出来上がりなので、公の場では控えた方が良さそう。
src
とdest
の比較だけじゃなくて、src
の内容をちょっといじってdest
に吐くみたいなことも出来るhandlerByContent
というオプションなどもある。READMEの例ではSSIのインクルードみたいなことやってて、そういったファイルをちょっと弄るだけのタスクなら自前でファイルの読み書きとかをすることなく簡単に書けるようだ。
まだ公開されたばかりのGruntプラグインなので、いろいろな変更や機能の追加がありそうでどういうものになるかはなんとも言えない。けどGruntのとりあえず全部やる的な大雑把さを効率化させるのに役に立ちそうで期待している。