外部 grunt タスク( grunt プラグイン)を作るとき

タスク

grunt の自作 task は Gruntfile.js 内に好きに書けるし、別ファイルに書いておくのも簡単( grunt.task.loadTasks )

プラグイン

タスクを別リポジトリで管理したいなあと思ったとき、その別ファイルを git の submodule にしても良いのだけど、公式おすすめは npm パッケージ化すること。 grunt 的には「 grunt plugin 」化すること。

手順

Creating plugins - Grunt: The JavaScript Task Runner

ここに従う。 npm publish さえしなければ超適当にやっても大丈夫。 npm publish されてるのでも超適当なの多いけど…。

オレオレ手順

あとは grunt-init gruntplugin すると、このプラグイン自体の Gruntfile.js ができて、実はこれは無くても他の Gruntfile.js から駆動はできるんだけど、このプラグイン自体の Gruntfile.js で test のタスクを定義してテストしようぜ、ってことになっている。自分は当面 npm publish するつもり無いので、ばっくり Gruntfile.js を削除する。

npm 化のミソである package.json は、 grunt-init gruntplugins した時の質問に答えていくとできあがる。普通の依存は npm install --save。開発時に必要な依存(テストライブラリとか)は npm install --save-dev するとインストールされると同時に package.json も適宜変更される。このパッケージルートディレクトリで一発、引数無しの npm link をし、さらにこのプラグイン(という名のタスク)を使いたい grunt 管理プロジェクトに移動して、そちらのルートディレクトリで今度は引数付きの npm link [hogehoge] をやる。ローカルマシン上でシンボリックリンクされ、プラグイン側の js を編集すれば即座にプロジェクト側でそれが反映されるようになる。プラグイン側が完成したら、 symlink を手動で rm して、改めて npm install する。

$ grunt [hogehoge] -v

いろいろおかしい時は -v をつけるとどこでコケているか分かる。

あとは

あとは grunt.registerMultiTask に渡したコールバックの実行時 this にいろいろ詰まっているので、それらを使って適当に操作する。 glob で指定した src も展開されて渡ってきて便利。この辺は、

Inside Tasks - Grunt: The JavaScript Task Runner

を読む。 console.dir(this) しても良い。 [Getter] と出てくるプロパティはさらに掘ると良い。あとは nodejs の世界。

grunt はまだバージョン1に到達していない。現状かなりゆるいタスクランナーだから、 make / rake / ant / maven / gradle なんかをちゃんと触ってから来た場合(そのへん一緒くたにするとそれぞれ役割が違うんだと怒られるけど)、あんまり期待し過ぎないのが重要。 mtime 必要であれば自分で見た上で自分でどっかに保存しとかないといけないと思う。ドキュメントもゆるい。文句があれば pullreq する。

JS で書けるのがいいんです。プラグインも static ファイルを操作、 JS に何かする系の新しいのは grunt にまず上がる印象。

あと、自分は bundler / carton より npm が好きなんです。