- Grunt 教程
- Grunt - 首页
- Grunt - 概述
- Grunt - 功能
- Grunt - 安装
- Grunt - 开始
- Grunt - 配置任务
- Grunt - 示例文件
- Grunt - 创建任务
- Grunt 有用资源
- Grunt - 快速指南
- Grunt - 有用资源
- Grunt - 讨论
Grunt - 创建任务
本章我们学习创建任务。每次运行 Grunt 时,都会指定一个或多个任务来运行,通知 Grunt 你希望它做什么。如果你指定了默认任务,那么它将默认运行。
别名任务
每当指定任务列表时,一个或多个其他任务可以通过新任务创建别名。运行别名将依次运行taskList中指定的每个任务。taskList参数应为任务数组,如下所示:
grunt.registerTask(taskName, [description, ] taskList)
例如,当你定义一个包含jshint、concat和uglify任务的taskList,并将taskName指定为default时,如果执行Grunt时未指定任何任务,则所有列出的任务都将自动运行。
grunt.registerTask('default', ['jshint', 'concat', 'uglify']);
你还可以指定任务参数,如下所示:
grunt.registerTask('dist', ['concat:dist', 'uglify:dist']);
在上面的任务中,别名dist运行concat和uglify任务。
多任务
每当你运行多个任务时,Grunt 都会在 Grunt 配置中搜索相同名称的属性。这些任务可以有多个配置,这些配置将使用任意命名的目标来定义。
当你同时指定任务和目标时,只有指定的目标配置将被处理。
grunt concat:foo
上面的命令将只运行目标foo。
当你只指定一个任务时,所有目标都将被处理。
grunt concat
上面的命令将迭代concat任务的所有目标。
使用grunt.task.renameTask重命名任务时,Grunt 会在 config 对象中搜索具有新任务名称的属性。
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时,任务将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); } });
自定义任务
如果你不想遵循多任务结构,你可以定义自己的自定义任务,如下所示:
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 Tutorialspoint!..'); }); // 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 meta.name 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'])); });