Grunt 深入任务内幕
当任务执行时,Grunt通过 this 对象向此任务暴露了很多任务特定的和。 同样这个对象也将暴露为grunt.task.current的形式在 templates中使用,例如,this.name也可以作为grunt.task.current.name来使用。
所有任务内部都可以使用的/
如果任务是异步的,必须此以Grunt。此返回 "done" ,应当在任务执行完毕后。false 或 Error 对象都可以传递给done,以Grunt此任务执行失败。
如果 this.async 没有被,此任务将会同步执行。
// Tell Grunt this task is asynchronous. var done = this.async(); // Your async code. setTimeout(function() { // Let's simulate an error, sometimes. var success = Math.random() > 0.5; // All done! done(success); }, 1000);
如果任务依赖于另外(或一些)任务的成功执行,在其依赖的任务没有运行或者运行失败的情况下,这个可以被用来强制Grunt。作为这个的参数,其依赖的任务列表可以是包含多个任务的数组,也可以是单个的任务。
注意,实际上这个并不会运行指定任务列表中的任务,它只是在任务列表中的任务没有成功运行的时候系统当前的任务失败了。
this.requires(tasksList)
这个可以指定或者多个字符串或者数组的配置为必需的。如果或多个必需的配置缺失,就系统当前任务失败。
this.requiresCon(prop [, prop [, ...]])
查看grunt.con文档了解更多关于配置相关的信息。
这个方式是grunt.con.requires的别名。
当前任务的,和定义在grunt.registerTask中的任务名一致。例如,如果以grunt sample或者grunt sample:foo的方式运行名为"sample"的任务,那么个任务内部,this.name的值就是"sample"。
注意,如果通过grunt.task.renask 了task,此也会跟着变为新名字。
当前任务的,在命令行中指定的任意使用逗号分割的参数或者。例如,如果以grunt sample:foo的方式运行名为"sample"的任务,那么个任务内部,this.nameArgs的值就是"sample:foo"。
注意,如果任务使用grunt.task.renask过,那么这个也会指向对应的新。
传递给当前任务的参数数组。例如,以grunt sample:foo:bar的方式运行名为"sample"的任务,那么个任务内部,this.args的值就是["foo", "bar"]。
注意,在多任务形式中,当前目标(名)会从this.args数组中省略。
根据传递给当前任务的参数的对象。例如,以grunt sample:foo:bar的形式运行名为"sample"的任务,那么个任务内部,this.flags的值是{foo: true, bar: true}。
注意,在多任务形式中,任务目标名不会被设置为。
当前任务执行期间grunt.log.error被的。如果在任务运行期间有信息,它可以用来让任务执行失败。
返回options对象。defaultsObj是可选参数,它的会被任意的任务级options对象的覆盖;在多任务形式中,它的会进一步被目标级的options对象的覆盖。
this.options([defaultsObj])
下面给出了例子,展示了在任务中可以如何使用this.options:
var options = this.options({ enabled: false, }); doSomething(options.enabled);
在配置任务指南中,有例子展示了如何从任务的角度来指定options。
多任务形式内部可用的/
在多任务形式中,这个包含了当前正被遍历的目标的。例如,如果名为"sample"的多任务带有{sample: {foo: "bar"}}这样的配置数据,当以grunt sample:foo的形式运行这个任务时,那么个任务内部,this.target的值就为"foo"。
在多任务形式中,使用Grunt的格式和选项,符模式或者动态映射方式指定的,都会被标准化为唯一的格式:即。
这意味着,任务不需要为了明确的处理格式,符格式,源到目标映射或者过滤或者目录而包含大量模板。任务只需要根据配置任务指南中的说明指定,Grunt会处理所有任务细节。
this.files永远都是数组。你的任务应该利用数组中每个对象的src和dest遍历this.files数组。在你的任务关注每个目标的多个源的情况下,src`也永远是数组。
注意,有可能不存在的也被包含在 src 的值当中,因此,你应该在使用前检查源是否存在。
下面的例子展示了简单的"concat"任务是怎样使用this.files的:
this.files.forEach(function(file) { var contents = file.src.filter(function(filepath) { // Remove nonexistent files (it's up to you to filter or warn here). if (!grunt.file.exists(filepath)) { grunt.log.warn('Source file "' + filepath + '" not found.'); return false; } else { return true; } }).map(function(filepath) { // Read and return the file's source. return grunt.file.read(filepath); }).join('\n'); // Write joined contents to destination filepath. grunt.file.write(file.dest, contents); // Print a success message. grunt.log.writeln('File "' + file.dest + '" created.'); });
如果你还需要使用原始对象的,可以通过每个单独的对象的orig来并使用,但是目前都没发现有访问原始的用例。
在多任务形式中,在src中通过任意的格式指定的都会被归并到数组。如果你的任务是"只读"的并且无需关心目标路径,可以使用这个数组来替代this.files。
下面这个例子展示了简单的"lint"的任务是怎样使用this.filesSrc的:
// Lint specified files. var files = this.filesSrc; var errorCount = 0; files.forEach(function(filepath) { if (!lint(grunt.file.read(filepath))) { errorCount++; } }); // Fail task if errors were logged. if (errorCount > 0) { return false; } // Otherwise, print a success message. grunt.log.ok('Files lint free: ' + files.length);
在多任务形式中,这是存储在给定目标的Grunt配置对象中的实际数据。例如,如果名为"sample"的多任务带有{sample: {foo: "bar"}}这样的配置数据,当以grunt sample:foo的形式运行这个任务时,那么个任务内部,this.data的值就为"bar"。
推荐使用this.options,this.files和this.filesSrc来替代this.data, 因为它们的值都是经过标准化的。