创建任务(Creating Tasks)
在本章中,让我们学习如何creating tasks 。 每当您运行Grunt时,都会指定一个或多个任务运行,以通知Grunt您希望它执行的操作。 如果指定default task ,则默认情况下将运行。
别名任务
每当指定任务列表时,新任务可以为一个或多个其他任务设置别名。 运行别名将依次运行taskList中的每个指定任务。 taskList参数应该是一个任务数组,如下所示 -
grunt.registerTask(taskName, [description, ] taskList)
例如,当您使用jshint , concat,和jshint任务定义taskList并将jshint指定为default ,如果执行Grunt而未指定任何任务,则将自动运行所有列出的任务。
grunt.registerTask('default', ['jshint', 'concat', 'uglify']);
您还可以指定任务参数,如下所示 -
grunt.registerTask('dist', ['concat:dist', 'uglify:dist']);
在上面的任务中,别名dist运行concat和uglify任务。
多任务
每当您运行多个任务时,Grunt都会在Grunt配置中搜索同名属性。 这些任务可以具有多个配置,这些配置将使用任意命名的targets进行定义。
指定任务和目标时,仅处理指定的目标配置。
grunt concat:foo
上面的命令只会运行目标foo 。
仅指定任务时,将处理所有目标。
grunt concat
上面的命令将遍历concat任务的所有目标。
使用grunt.task.renameTask重命名任务时,Grunt会在配置对象中搜索具有new任务名称的属性。
grunt.initConfig({
log: {
foo: [1, 2, 3],
bar: 'Welcome to xnip',
sap: true
}
});
grunt.registerMultiTask('log', 'Log stuff.', function() {
grunt.log.writeln(this.target + ': ' + this.data);
});
在上面的例子中,多任务将记录foo: 1,2,3如果Grunt通过grunt log:foo运行,或者它将记录bar: Welcome to xnip每次运行grunt log:bar时的bar: Welcome to xnip 。 它将记录foo: 1,2,3然后bar: Welcome to xnip然后sap: true当Grunt以grunt log运行时为sap: true 。
基本任务
无论何时运行基本任务,Grunt都不会搜索配置或环境。 相反,它运行指定的任务函数,传递作为函数参数指定的任何冒号分隔的参数。
grunt.registerTask(taskName, [description, ] taskFunction)
在以下示例中,任务记录foo, testing 123如果通过grunt foo:testing:123命令执行Grunt,则grunt foo:testing:123 。 每当任务在没有参数的情况下运行为grunt foo ,任务将log 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);
}
});
自定义任务
如果您不想遵循multi task结构,可以定义自定义任务,如下所示 -
grunt.registerTask('default', 'My "default" task description.', function() {
grunt.log.writeln('Currently running the "default" task.');
});
可以在另一个任务中运行任务,如下所示 -
grunt.registerTask('foo', 'My "foo" task.', function() {
// Enqueue bar and baz tasks, to run after foo completes, in-order.
grunt.task.run('bar', 'baz');
// Or:
grunt.task.run(['bar', 'baz']);
});
您还可以创建异步任务,如下所示 -
grunt.registerTask('asyncfoo', 'My "asyncfoo" task.', function() {
// Force task into async mode and grab a handle to the done() function.
var done = this.async();
// Run some sync stuff.
grunt.log.writeln('Processing your task..');
// Run some async stuff.
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.');
}
// If this task had errors then fail by returning 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() {
// Fail task if foo task failed or never ran.
grunt.task.requires('foo');
// This code executes if the foo task executed successfully.
grunt.log.writeln('Hello, World.. Welcome to xnip!..');
});
// Usage:
// grunt foo bar doesn't log, because foo failed to execute.
// **Note: This is an example of space-separated sequential commands,
// (similar to executing two lines of code: `grunt foo` then `grunt bar`)
// grunt bar doesn't log, because foo never ran.
只要找不到所需的配置属性,任务甚至可能会失败。
grunt.registerTask('foo', 'My task "foo" .', function() {
// Fail task if <i>meta.name</i> config properties is missing
// Format 1: String
grunt.config.requires('meta.name');
// or Format 2: Array
grunt.config.requires(['meta', 'name']);
// Log... conditionally.
grunt.log.writeln('This only log if meta.name is defined in the config.');
});
任务可以访问配置属性,如下所示 -
grunt.registerTask('foo', 'My task "foo" .', function() {
// Log the value of the property. Returns null if the property is undefined.
grunt.log.writeln('The meta.name property is: ' + grunt.config('meta.name'));
// Also logs the value of the property. Returns null if the property is undefined.
grunt.log.writeln('The meta.name property is: ' + grunt.config(['meta', 'name']));
});