内部任务
任务运行时,Grunt 通过 this
对象在任务函数内部暴露许多特定于任务的实用属性和方法。这个对象也作为 grunt.task.current
暴露出来,以便在 模板 中使用,例如,属性 this.name
也可以作为 grunt.task.current.name
使用。
所有任务内部
this.async
如果任务是异步的,则必须调用此方法来指示 Grunt 等待。它返回一个指向“完成”函数的句柄,该函数应在任务完成后调用。可以将 false
或 Error
对象传递给完成函数,以指示 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);
this.requires
如果一个任务依赖于另一个任务(或多个任务)的成功完成,则可以使用此方法强制 Grunt 在其他任务未运行或失败时中止。任务列表可以是任务名称数组或单个任务名称,作为参数。
请注意,这实际上不会运行指定的任务,它只会在此前未成功运行的情况下使当前任务失败。
this.requires(tasksList)
this.requiresConfig
如果缺少一个或多个必需的 配置 属性,则使当前任务失败。可以指定一个或多个字符串或数组配置属性。
this.requiresConfig(prop [, prop [, ...]])
有关配置属性的更多信息,请参阅 grunt.config 文档。
此方法是 grunt.config.requires 方法的别名。
this.name
任务的名称,在 grunt.registerTask
中定义。例如,如果“示例”任务作为 grunt sample
或 grunt sample:foo
运行,则在任务函数内部,this.name
将是 "sample"
。
请注意,如果任务已使用 grunt.task.renameTask 重命名,则此属性将反映新名称。
this.nameArgs
任务的名称,包括在命令行上指定的任何以冒号分隔的参数或标志。例如,如果“示例”任务作为 grunt sample:foo
运行,则在任务函数内部,this.nameArgs
将是 "sample:foo"
。
请注意,如果任务已使用 grunt.task.renameTask 重命名,则此属性将反映新名称。
this.args
传递给任务的参数数组。例如,如果“示例”任务作为 grunt sample:foo:bar
运行,则在任务函数内部,this.args
将是 ["foo", "bar"]
。
请注意,在多任务中,当前目标将从 this.args
数组中省略。
this.flags
从传递给任务的参数生成的 对象。例如,如果“示例”任务作为 grunt sample:foo:bar
运行,则在任务函数内部,this.flags
将是 {foo: true, bar: true}
。
请注意,在多任务内部,目标名称**不会**设置为标志。
this.errorCount
此任务期间发生的 grunt.log.error 调用次数。如果在任务期间记录了错误,则可以使用此方法使任务失败。
this.options
返回一个选项对象。可选的 defaultsObj
参数的属性将被任何任务级 options
对象属性覆盖,这些属性将在多任务中被任何目标级 options
对象属性进一步覆盖。
this.options([defaultsObj])
此示例显示了任务如何使用 this.options
方法
var options = this.options({
enabled: false,
});
doSomething(options.enabled);
配置任务 指南从任务用户的角度展示了如何指定选项的示例。
多任务内部
this.target
在多任务中,此属性包含当前正在迭代的目标的名称。例如,如果“示例”多任务作为 grunt sample:foo
运行,配置数据为 {sample: {foo: "bar"}}
,则在任务函数内部,this.target
将是 "foo"
。
this.files
在多任务中,使用任何 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
属性下的每个单独文件对象上都可用,但没有已知的用例来访问原始属性。
this.filesSrc
在多任务中,通过任何 文件格式 指定的所有 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);
this.data
在多任务中,这是存储在 Grunt 配置对象中针对给定目标的实际数据。例如,如果“示例”多任务作为 grunt sample:foo
运行,配置数据为 {sample: {foo: "bar"}}
,则在任务函数内部,this.data
将是 "bar"
。
建议使用 this.options
、this.files
和 this.filesSrc
而不是 this.data
,因为它们的值是规范化的。