Hail2u

Gruntで実行しているエイリアス・タスクの名前とターゲットの取得

Gruntのタスク内から今実行されているタスクの名前とターゲットは、それぞれthis.namethis.targetで取得できる。しかしエイリアス・タスク経由での実行の場合、その名前やターゲットを簡単に取得する方法は用意されてない。どうやっても拾えないかというとそうでもなく、grunt.cli.tasksにコマンドラインで実際に指定されたタスク群が配列として格納されるので、それから拾えば良い。

例えば以下のようなオプションでGruntを実行し、普通のマルチ・タスクとエイリアス・タスクを複数まとめて実行したとする。

$ grunt multi:foo alias:bar

この場合grunt.cli.tasksは以下のような配列になる。

[
  'multi:foo',
  'alias:bar'
];

このgrunt.cli.tasksにはコマンドライン・オプションで指定したタスクがそのままの順序で格納される。そのためエイリアス・タスクの名前やターゲットへアクセスできるというわけだ。

'use strict';

module.exports = function (grunt) {
  grunt.registerMultiTask(
    'example',
    'Example task.',
    function () {
      if (grunt.cli.tasks.some(function (task) {
        return task === 'alias:bar';
      })) {
        // Do task.
      }
    }
  );

タスク内からはこのようにしてアクセスすることになるだろう。Array.prototype.some()を使ってgrunt.cli.tasksを調べ、alias:bar経由での実行の時のみ特別扱いしてやる、というわけだ。


Gruntの本道としては設定を切り分けてoptionsでフラグを立ててやるべきようなことなので、あまり必要とされることはない。そのためかアクセスする方法が用意されていないのだが、書き捨てるタスクではコード側でガッツリやってやった方が面倒じゃないことも多い。エイリアス・タスクの名前やターゲットと同じような意味を持つ設定を書かなくて済み、コード側で完結できるからだ。