任務內部
任務執行時,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
值中可能會包含不存在的檔案,因此你可能想要明確測試來源檔案是否存在,再使用它們。
此範例顯示簡單的「合併」工作如何使用 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
。
此範例顯示簡單的「程式碼檢查」工作如何使用 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 範例:foo
執行,設定資料為 {範例: {foo: "bar"}}
,在任務函式內,this.data
會是 "bar"
。
建議使用 this.options
this.files
和 this.filesSrc
,而不是 this.data
,因為它們的值已正規化。