當(dāng)一個(gè)任務(wù)執(zhí)行時(shí),Grunt通過 this
對象向此任務(wù)函數(shù)暴露了很多任務(wù)特定的屬性和方法。 同樣這個(gè)對象也將暴露為grunt.task.current
的形式在 templates中使用,例如,this.name
屬性也可以作為grunt.task.current.name
來使用。
如果一個(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);
如果一個(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)
這個(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è)別名。
當(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>
當(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)的新名稱。
傳遞給當(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ù)組中省略。
根據(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)記。
當(dāng)前任務(wù)執(zhí)行期間grunt.log.error方法被調(diào)用的次數(shù)。如果在任務(wù)運(yùn)行期間有錯(cuò)誤信息輸出,它可以用來讓任務(wù)執(zhí)行失敗。
返回一個(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。
在一個(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"
。
在一個(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è)對象的
src和
dest屬性遍歷
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)有訪問原始屬性的用例。
在多任務(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);
在多任務(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.files
和this.filesSrc
來替代this.data
, 因?yàn)樗鼈兊闹刀际墙?jīng)過標(biāo)準(zhǔn)化的。
更多建議: