Grunt 深入任務(wù)內(nèi)幕

2018-11-02 13:46 更新

深入任務(wù)內(nèi)幕

當(dāng)一個(gè)任務(wù)執(zhí)行時(shí),Grunt通過 this 對象向此任務(wù)函數(shù)暴露了很多任務(wù)特定的屬性和方法。 同樣這個(gè)對象也將暴露為grunt.task.current的形式在 templates中使用,例如,this.name屬性也可以作為grunt.task.current.name來使用。

所有任務(wù)內(nèi)部都可以使用的方法/屬性

this.async

如果一個(gè)任務(wù)是異步的,必須調(diào)用此方法以通知Grunt。此方法返回一個(gè) "done" 函數(shù),應(yīng)當(dāng)在任務(wù)執(zhí)行完畢后調(diào)用。false 或 Error 對象都可以傳遞給done函數(shù),以通知Grunt此任務(wù)執(zhí)行失敗。

如果 this.async 方法沒有被調(diào)用,此任務(wù)將會(huì)同步執(zhí)行。

// 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

如果一個(gè)任務(wù)依賴于另外一個(gè)(或一些)任務(wù)的成功執(zhí)行,在其依賴的任務(wù)沒有運(yùn)行或者運(yùn)行失敗的情況下,這個(gè)方法可以被用來強(qiáng)制Grunt退出。作為這個(gè)方法的參數(shù),其依賴的任務(wù)列表可以是一個(gè)包含多個(gè)任務(wù)名稱的數(shù)組,也可以是單個(gè)的任務(wù)名稱。

注意,實(shí)際上這個(gè)方法并不會(huì)運(yùn)行指定任務(wù)列表中的任務(wù),它只是在任務(wù)列表中的任務(wù)沒有成功運(yùn)行的時(shí)候通知系統(tǒng)當(dāng)前的任務(wù)失敗了。

this.requires(tasksList)

this.requiresConfig

這個(gè)方法可以指定一個(gè)或者多個(gè)字符串或者數(shù)組的配置屬性為必需的。如果一個(gè)或多個(gè)必需的配置屬性缺失,就通知系統(tǒng)當(dāng)前任務(wù)失敗。

this.requiresConfig(prop [, prop [, ...]])

查看grunt.config文檔了解更多關(guān)于配置屬性相關(guān)的信息。

這個(gè)方式是grunt.config.requires方法的一個(gè)別名。

this.name

當(dāng)前任務(wù)的名稱,和定義在grunt.registerTask中的任務(wù)名一致。例如,如果以grunt sample或者grunt sample:foo的方式運(yùn)行一個(gè)名為"sample"的任務(wù),那么在這個(gè)任務(wù)函數(shù)內(nèi)部,this.name的值就是"sample"。

注意,如果通過grunt.task.renameTask 重命名了一個(gè)task,此屬性也會(huì)跟著變?yōu)樾旅帧?/em>

this.nameArgs

當(dāng)前任務(wù)的名稱,包括在命令行中指定的任意使用逗號(hào)分割的參數(shù)或者標(biāo)記。例如,如果以grunt sample:foo的方式運(yùn)行一個(gè)名為"sample"的任務(wù),那么在這個(gè)任務(wù)函數(shù)內(nèi)部,this.nameArgs的值就是"sample:foo"。

注意,如果一個(gè)任務(wù)使用grunt.task.renameTask方法重命名過,那么這個(gè)屬性也會(huì)指向?qū)?yīng)的新名稱。

this.args

傳遞給當(dāng)前任務(wù)的參數(shù)數(shù)組。例如,以grunt sample:foo:bar的方式運(yùn)行一個(gè)名為"sample"的任務(wù),那么在這個(gè)任務(wù)函數(shù)內(nèi)部,this.args的值就是["foo", "bar"]

注意,在多任務(wù)形式中,當(dāng)前目標(biāo)(名)會(huì)從this.args數(shù)組中省略。

this.flags

根據(jù)傳遞給當(dāng)前任務(wù)的參數(shù)生成的一個(gè)對象。例如,以grunt sample:foo:bar的形式運(yùn)行一個(gè)名為"sample"的任務(wù),那么在這個(gè)任務(wù)函數(shù)內(nèi)部,this.flags的值是{foo: true, bar: true}

注意,在多任務(wù)形式中,任務(wù)目標(biāo)名不會(huì)被設(shè)置為一個(gè)標(biāo)記。

this.errorCount

當(dāng)前任務(wù)執(zhí)行期間grunt.log.error方法被調(diào)用的次數(shù)。如果在任務(wù)運(yùn)行期間有錯(cuò)誤信息輸出,它可以用來讓任務(wù)執(zhí)行失敗。

this.options

返回一個(gè)options對象。defaultsObj是一個(gè)可選參數(shù),它的屬性會(huì)被任意的任務(wù)級(jí)options對象的屬性覆蓋;在多任務(wù)形式中,它的屬性會(huì)進(jìn)一步被目標(biāo)級(jí)的options對象的屬性覆蓋。

this.options([defaultsObj])

下面給出了一個(gè)例子,展示了在任務(wù)中可以如何使用this.options方法:

var options = this.options({
  enabled: false,
});

doSomething(options.enabled);

配置任務(wù)指南中,有一個(gè)例子展示了如何從用戶任務(wù)的角度來指定options。

多任務(wù)形式內(nèi)部可用的方法/屬性

this.target

在一個(gè)多任務(wù)形式中,這個(gè)屬性包含了當(dāng)前正被遍歷的目標(biāo)的名稱。例如,如果一個(gè)名為"sample"的多任務(wù)帶有{sample: {foo: "bar"}}這樣的配置數(shù)據(jù),當(dāng)以grunt sample:foo的形式運(yùn)行這個(gè)任務(wù)時(shí),那么在這個(gè)任務(wù)函數(shù)內(nèi)部,this.target屬性的值就為"foo"。

this.files

在一個(gè)多任務(wù)形式中,使用Grunt支持的文件格式和選項(xiàng)通配符模式或者動(dòng)態(tài)映射方式指定的文件,都會(huì)被自動(dòng)標(biāo)準(zhǔn)化為一個(gè)唯一的格式:即文件數(shù)組格式

這意味著,任務(wù)不需要為了明確的處理自定義文件格式,通配符格式,源文件到目標(biāo)文件映射或者過濾輸出文件或者目錄而包含大量模板。任務(wù)只需要根據(jù)配置任務(wù)指南中的說明指定文件,Grunt會(huì)自動(dòng)處理所有任務(wù)細(xì)節(jié)。

this.files屬性永遠(yuǎn)都是一個(gè)數(shù)組。你的任務(wù)應(yīng)該利用數(shù)組中每個(gè)對象的srcdest屬性遍歷this.files數(shù)組。在你的任務(wù)關(guān)注每個(gè)目標(biāo)文件的多個(gè)源文件的情況下,src`屬性也永遠(yuǎn)是一個(gè)數(shù)組。

注意,有可能不存在的文件也被包含在 src 的值當(dāng)中,因此,你應(yīng)該在使用前檢查源文件是否存在。

下面的例子展示了一個(gè)簡單的"concat"任務(wù)是怎樣使用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.');
});

如果你還需要使用原始文件對象的屬性,可以通過每個(gè)單獨(dú)的文件對象的orig屬性來獲取并使用,但是目前都沒發(fā)現(xiàn)有訪問原始屬性的用例。

this.filesSrc

在多任務(wù)形式中,在src中通過任意的文件格式指定的文件都會(huì)被歸并到一個(gè)數(shù)組。如果你的任務(wù)是"只讀"的并且無需關(guān)心目標(biāo)文件路徑,可以使用這個(gè)數(shù)組來替代this.files

下面這個(gè)例子展示了一個(gè)簡單的"lint"的任務(wù)是怎樣使用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

在多任務(wù)形式中,這是存儲(chǔ)在給定目標(biāo)的Grunt配置對象中的實(shí)際數(shù)據(jù)。例如,如果一個(gè)名為"sample"的多任務(wù)帶有{sample: {foo: "bar"}}這樣的配置數(shù)據(jù),當(dāng)以grunt sample:foo的形式運(yùn)行這個(gè)任務(wù)時(shí),那么在這個(gè)任務(wù)函數(shù)內(nèi)部,this.data的值就為"bar"。

推薦使用this.options,this.filesthis.filesSrc來替代this.data, 因?yàn)樗鼈兊闹刀际墙?jīng)過標(biāo)準(zhǔn)化的。

以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)