任務內部
當任務執行時,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 支援的 檔案格式和選項、glob 模式 或 動態對應 指定的所有檔案會自動正規化為單一格式:檔案陣列檔案格式。
這表示任務不需要包含大量樣板程式碼來明確處理自訂檔案格式、glob 模式、將來源檔案對應到目標檔案或過濾檔案或目錄。任務使用者只要按照設定任務指南指定檔案,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 sample:foo
執行,設定資料為 {sample: {foo: "bar"}}
,在任務函式內,this.data
會是 "bar"
。
建議使用 this.options
this.files
和 this.filesSrc
取代 this.data
,因為它們的值已正規化。