黑人的命也是命

内部任务

任务运行时,Grunt 通过 this 对象在任务函数内部暴露许多特定于任务的实用属性和方法。这个对象也作为 grunt.task.current 暴露出来,以便在 模板 中使用,例如,属性 this.name 也可以作为 grunt.task.current.name 使用。

所有任务内部

this.async

如果任务是异步的,则必须调用此方法来指示 Grunt 等待。它返回一个指向“完成”函数的句柄,该函数应在任务完成后调用。可以将 falseError 对象传递给完成函数,以指示 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 samplegrunt 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 数组,利用该数组中每个对象的 srcdest 属性。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.optionsthis.filesthis.filesSrc 而不是 this.data,因为它们的值是规范化的。