タスクの作成

タスクはGrutnにとって無くてはならない存在です。 頻繁に使用されるものに、jshintまたはnodeunitがあります。 1つまたは複数のタスクを指定して、Gruntに実行して欲しいタスクを伝えます。

もし、タスクが指定されなかった場合、"default"と定義されているタスクが実行されます。

エイリアスタスク

もし、タスクリストが指定されると、新しいタスクは他のタスク(1つまたは複数)のエイリアスになります。 "alias task"が実行されると、taskListに指定された各タスクが順に実行されます。 taskListの引数は、タスクの配列でなければなりません。

grunt.registerTask(taskName, [description, ] taskList)

下記のエイリアスタスクの例では、"jshint"、"gunit"、"concat"、"uglify"タスクが、 Gruntが何もタスクを指定されなかった場合に自動的に実行されるように、"default"タスクとして定義しています。

grunt.registerTask('default', ['jshint', 'qunit', 'concat', 'uglify']);

タスク引数も同様に指定することが可能です。 下記の例では、"dist"は、"concat"と"min"タスクそれぞれを"dist"引数付きで実行します。

grunt.registerTask('dist', ['concat:dist', 'uglify:dist']);

マルチタスク

マルチタスクが実行されると、Gruntは設定内で同じ名前のプロパティを探します。 マルチタスクは、"targets."のついた任意の名前で定義された複数の設定を持つことが可能です。

タスクとターゲットの両方を、grunt concat:fooまたは、grunt concat:barのように 指定すると、指定されたターゲットの構成が処理され、grutn concatが実行されると 全てのターゲットをそれぞれ繰り返し処理します。 もし、タスクの名前がgrunt.renameTaskによって変更されていた場合、 Gruntは、設定オブジェクト内の新しい名前のプロパティを探します。

grunt-contrib-jshintgrunt-contrib-concat を含む、ほとんどのcontribタスクはマルチタスクです。

grunt.registerMultiTask(taskName, [description, ] taskFunction)

下記の例のように設定が与えられていた場合、
grunt log:fooと実行されると、foo: 1,2,3とログ出力され、
grunt log:barと実行されると、bar: hello worldとログ出力され、
grunt logと実行すると、foo: 1,2,3bar: hello worldbaz: falseがそれぞれログ出力されます。

grunt.initConfig({
  log: {
    foo: [1, 2, 3],
    bar: 'hello world',
    baz: false
  }
});

grunt.registerMultiTask('log', 'Log stuff.', function() {
  grunt.log.writeln(this.target + ': ' + this.data);
});

"ベーシック"タスク

ベーシックタスクが実行されると、Gruntは設定または環境設定を探すことはせず、 関数の引数としてコロン区切りの値を指定されたタスク関数を実行します。

grunt.registerTask(taskName, [description, ] taskFunction)

grunt foo:testing:123が実行されると、foo, testing 123が ログ出力され、
grunt fooが実行されると、foo, no argsが ログ出力されます。

grunt.registerTask('foo', 'A sample task that logs stuff.', function(arg1, arg2) {
  if (arguments.length === 0) {
    grunt.log.writeln(this.name + ", no args");
  } else {
    grunt.log.writeln(this.name + ", " + arg1 + " " + arg2);
  }
});

カスタムタスク

タスクが"マルチタスク"の構造に沿えない場合、カスタムタスクを使用します。

grunt.registerTask('default', 'My "default" task description.', function() {
  grunt.log.writeln('現在、"default"タスクを実行中…');
});

タスク内で、別のタスクを実行することが可能です。

grunt.registerTask('foo', 'My "foo" task.', function() {
  // タスクのキューに"bar"と"baz"を入れ、"foo"が完了したら順に実行されます。
  grunt.task.run('bar', 'baz');
  // または、このようにも書ける。
  grunt.task.run(['bar', 'baz']);
});

タスクは非同期で実行することも可能です。

grunt.registerTask('asyncfoo', 'My "asyncfoo" task.', function() {
  // 非同期モード内でタスクを実行するよう、"done"関数にハンドルを掴ませておく
  var done = this.async();
  // "同期"処理を実行
  grunt.log.writeln('タスクを実行中…');
  // 非同期処理を実行
  setTimeout(function() {
    grunt.log.writeln('全て完了!');
    done();
  }, 1000);
});

タスクは自身の名前と引数を参照することが出来ます。

grunt.registerTask('foo', 'My "foo" task.', function(a, b) {
  grunt.log.writeln(this.name, a, b);
});

// 使い方:
// grunt foo foo:bar
//   ログ出力: "foo", undefined, undefined
//   ログ出力: "foo", "bar", undefined
// grunt foo:bar:baz
//   ログ出力: "foo", "bar", "baz"

何らかのエラーログが出力された場合、タスクを失敗とみなすことが出来ます。

grunt.registerTask('foo', 'My "foo" task.', function() {
  if (failureOfSomeKind) {
    grunt.log.error('This is an error message.');
  }

  // このタスクがエラーであれば、falseを返すことによって失敗とします。
  if (ifErrors) { return false; }

  grunt.log.writeln('This is the success message');
});

--forceを指定された場合を除き、タスクが失敗した際に全てのサブシーケンスのタスクを中止させます。

grunt.registerTask('foo', 'My "foo" task.', function() {
  // 同期処理失敗
  return false;
});

grunt.registerTask('bar', 'My "bar" task.', function() {
  var done = this.async();
  setTimeout(function() {
    // 非同期処理失敗
    done(false);
  }, 1000);
});

タスクは他のタスクの成功に依存することがあります。 grunt.task.requiresは、実際には他のタスクを実行するわけでは無いことに注意してください。 そのタスクが実行され、失敗していないことをチェックします。

grunt.registerTask('foo', 'My "foo" task.', function() {
  return false;
});

grunt.registerTask('bar', 'My "bar" task.', function() {
  // "foo"タスクが失敗、または実行されないと、このタスクは失敗します。
  grunt.task.requires('foo');
  // "foo"タスクの実行が成功すると、このコードが実行されます。
  grunt.log.writeln('Hello, world.');
});

// 例:
// grunt foo bar
//   fooが失敗するので、ログ出力されません。
// grunt bar
//   fooが実行されないので、ログ出力されません。

必要な設定プロパティが存在しなければタスクは失敗します。

grunt.registerTask('foo', 'My "foo" task.', function() {
  // もし、"meta.name"の設定プロパティが無ければ、タスクは失敗します。
  grunt.config.requires('meta.name');
  // これも同様に、"meta.name"の設定プロパティが無ければ、タスクは失敗します。
  grunt.config.requires(['meta', 'name']);
  // ログ出力(meta.nameが設定に定義されている場合のみ)
  grunt.log.writeln('This will only log if meta.name is defined in the config.');
});

タスクは設定プロパティにアクセスすることが出来ます。

grunt.registerTask('foo', 'My "foo" task.', function() {
  // プロパティ値をログ出力します。プロパティが定義されて無ければ、nullを返します。
  grunt.log.writeln('The meta.name property is: ' + grunt.config('meta.name'));
  // これもプロパティ値をログ出力し、プロパティが定義されて無ければ、nullを返します。
  grunt.log.writeln('The meta.name property is: ' + grunt.config(['meta', 'name']));
});

その他の例については、 contrib tasks を参照してみてください。

CLIオプション/環境

(現在、作成中の模様)

なぜ非同期タスクが完了しないのか?

タスクが非同期処理であることをGruntに伝えるためのthis.asyncメソッドを呼び出すのを忘れることは、 非同期処理を知るための良い機会です。 分かりやすくするために、Gruntはタスク内で this.sync()を呼び出すことによって非同期処理に切り替えることが可能な コーディングスタイルを使用しています。

done()関数にfalseを渡すことは、 Gruntにタスクが失敗であると伝えることを意味することに注意してください。

grunt.registerTask('asyncme', 'My asynchronous task.', function() {
  var done = this.async();
  doSomethingAsync(done);
});

 Back to top

© 2010 - 2017 STUDIO KINGDOM