Grunt - 创建任务

在本章中,让我们了解创建任务。每当您运行 Grunt 时,都会指定一个或多个要运行的任务,以通知 Grunt 您希望它做什么。如果您指定默认任务,则它将默认运行。

别名任务

每当指定任务列表时,一个或多个其他任务都可以由新任务别名。运行别名将依次运行taskList中的每个指定任务。 taskList 参数应为如下所示的任务数组 −

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

例如,当您使用 jshintconcatuglify 任务定义 taskList 并将 taskName 指定为 default 时,如果在未指定任何任务的情况下执行 Grunt,则所有列出的任务都将自动运行。

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

您还可以指定任务参数,如下所示 −

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

在上面的任务中,别名 dist 同时运行 concatuglify 任务。

多任务

每当您运行多个任务时,Grunt 都会在 Grunt 配置中搜索同名的属性。这些任务可以有多个配置,这些配置将使用任意命名的目标进行定义。

当您同时指定任务和目标时,将仅处理指定的目标配置。

grunt concat:foo

上述命令将仅运行目标foo

当您仅指定任务时,将处理所有目标。

grunt concat

上述命令将遍历concat任务的所有目标。

当您使用grunt.task.renameTask重命名任务时,Grunt 会在配置对象中搜索具有new任务名称的属性。

grunt.initConfig({
   log: {
      foo: [1, 2, 3],
      bar: 'Welcome to tutorialspoint',
      sap: true
   }
});

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

在上面的例子中,如果 Grunt 是通过 grunt log:foo 运行的,多任务将记录 foo: 1,2,3,或者每当通过 grunt log:bar 运行时,它将记录 bar: Welcome to tutorialspoint。当 Grunt 作为 grunt log 运行时,它将记录 foo: 1,2,3,然后记录 bar: Welcome to tutorialspoint,然后记录 sap: true

基本任务

每当您运行基本任务时,Grunt 都不会搜索配置或环境。相反,它运行指定的任务函数,并将指定的任何冒号分隔的参数作为函数参数传递。

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

在下面的例子中,如果 Grunt 通过 grunt foo:testing:123 命令执行,则任务会记录 foo, testing 123。每当任务以 grunt foo 的形式运行时不带参数时,任务将 记录 foo, no args

grunt.registerTask('foo', 'A simple task to 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('Currently running the "default" task.');
});  

可以在另一个任务中运行一个任务,如下所示 −

grunt.registerTask('foo', 'My "foo" task.', function() {
   // 将 bar 和 baz 任务排入队列,在 foo 完成后按顺序运行。
   grunt.task.run('bar', 'baz');
   // Or:
   grunt.task.run(['bar', 'baz']);
});  

您还可以创建异步任务,如下所示 −

grunt.registerTask('asyncfoo', 'My "asyncfoo" task.', function() {
    // 强制任务进入异步模式并获取 done() 函数的句柄。
    var done = this.async();
    // 运行一些同步内容。
    grunt.log.writeln('Processing your task..');
    // 运行一些异步内容。
    setTimeout(function() {
      grunt.log.writeln('Finished!');
      done();
   }, 1000);
});

您可以创建可以访问其名称和参数的任务,如下所示−

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

// Usage:
// grunt foo
//   logs: "foo", undefined, undefined
// grunt foo:bar
//   logs: "foo", "bar", undefined
// grunt foo:bar:baz
//   logs: "foo", "bar", "baz"

您可以以这样的方式创建任务,每当记录任何错误时,任务就会失败,如下所示 −

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

   // 如果此任务有错误则返回 false 并失败
   if (ifErrors) { return false; }

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

每当一个任务失败时,除非指定了 --force,否则所有后续任务都将被终止。

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

grunt.registerTask('bar', 'My task "bar" .', function() {
   var done = this.async();
   setTimeout(function() {
      // Fail asynchronously.
      done(false);
   }, 1000);
});  

任务可以依赖于其他任务才能成功执行。请记住,grunt.task.requires 实际上不会执行其他任务,而是仅检查它是否已执行且没有失败。

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

grunt.registerTask('bar', 'My task "bar" .', function() {
    // 如果 foo 任务失败或从未运行,则任务失败。
    grunt.task.requires('foo');
    // 如果 foo 任务成功执行,则执行此代码。
   	grunt.log.writeln('Hello, World.. Welcome to Tutorialspoint!..');
});

// 用法:
// grunt foo bar 不记录,因为 foo 执行失败。
// **注意:这是一个空格分隔的顺序命令的示例,
//(类似于执行两行代码:`grunt foo` 然后 `grunt bar`)
// grunt bar 不记录,因为 foo 从未运行。

只要找不到所需的配置属性,任务甚至可能会失败。

grunt.registerTask('foo', 'My task "foo" .', function() {
    // 如果缺少 meta.name 配置属性,则任务失败
    // 格式 1:字符串
    grunt.config.requires('meta.name');
    // 或格式 2:数组
    grunt.config.requires(['meta', 'name']);
    // 有条件地记录...。
   	grunt.log.writeln('This only log if meta.name is defined in the config.');
});  

任务可以访问配置属性,如下所示−

grunt.registerTask('foo', 'My task "foo" .', 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']));
});