任務 (Task)

API 文件任務 (Task)

任務 (Task) 代表建置中單一原子性的工作單元,例如編譯類別或產生 javadoc。

每個任務都屬於一個 專案 (Project)。您可以使用 TaskContainer 上的各種方法來建立和查找任務實例。例如,TaskContainer.create(java.lang.String) 建立一個具有指定名稱的空任務。您也可以在建置檔案中使用 task 關鍵字

task myTask
task myTask { configure closure }
task myTask(type: SomeType)
task myTask(type: SomeType) { configure closure }

每個任務都有一個名稱,可用於在其所屬專案中引用該任務,以及一個完全限定路徑,該路徑在所有專案中的所有任務中都是唯一的。路徑是所屬專案的路徑和任務名稱的串聯。路徑元素使用 : 字元分隔。

任務動作

任務 (Task) 由一系列 Action 物件組成。當任務執行時,每個動作都會依序執行,方法是呼叫 Action.execute(T)。您可以透過呼叫 Task.doFirst(org.gradle.api.Action)Task.doLast(org.gradle.api.Action) 將動作新增至任務。

Groovy 閉包也可以用於提供任務動作。當動作執行時,將會呼叫閉包,並將任務作為參數傳遞。您可以透過呼叫 Task.doFirst(groovy.lang.Closure)Task.doLast(groovy.lang.Closure) 將動作閉包新增至任務。

任務動作可以拋出 2 個特殊的例外,以中止執行並繼續而不會使建置失敗。任務動作可以透過拋出 StopActionException 來中止動作的執行並繼續執行任務的下一個動作。任務動作可以透過拋出 StopExecutionException 來中止任務的執行並繼續執行下一個任務。使用這些例外情況可讓您擁有先決條件動作,如果條件不成立,則會跳過任務或任務的一部分的執行。

任務相依性和任務排序

任務可能相依於其他任務,或者可以排程為始終在另一個任務之後執行。Gradle 確保在執行任務時遵守所有任務相依性和排序規則,以便在執行完所有任務的相依性和任何「必須在之後執行」的任務後,再執行該任務。

任務的相依性使用 Task.dependsOn(java.lang.Object[])Task.setDependsOn(java.lang.Iterable) 來控制,而 Task.mustRunAfter(java.lang.Object[])Task.setMustRunAfter(java.lang.Iterable)Task.shouldRunAfter(java.lang.Object[])Task.setShouldRunAfter(java.lang.Iterable) 用於指定任務之間的排序。您可以使用以下任何類型的物件來指定相依性和排序

  • StringCharSequencegroovy.lang.GString 任務路徑或名稱。相對路徑是相對於任務的 專案 (Project) 來解釋的。這可讓您參考其他專案中的任務。這些任務參考不會導致任務建立。
  • 任務 (Task)
  • TaskDependency 物件。
  • TaskReference 物件。
  • Buildable 物件。
  • RegularFilePropertyDirectoryProperty
  • Provider 物件。可能包含此處列出的任何類型。
  • IterableCollectionMap 或陣列。可能包含此處列出的任何類型。iterable/collection/map/array 的元素會遞迴轉換為任務。
  • Callablecall() 方法可能會傳回此處列出的任何類型。其傳回值會遞迴轉換為任務。null 傳回值會被視為空集合。
  • Groovy Closure 或 Kotlin 函數。閉包可以將 Task 作為參數。閉包或函數可能會傳回此處列出的任何類型。其傳回值會遞迴轉換為任務。null 傳回值會被視為空集合。
  • 任何其他內容都會被視為錯誤。

在建置檔案中使用任務

動態屬性

任務 (Task) 具有 4 個屬性「範圍」。您可以從建置檔案依名稱存取這些屬性,或呼叫 Task.property(java.lang.String) 方法。您可以透過呼叫 Task.setProperty(java.lang.String, java.lang.Object) 方法來變更這些屬性的值。

  • 任務 (Task) 物件本身。這包括 任務 (Task) 實作類別宣告的任何屬性 getter 和 setter。此範圍的屬性是可讀或可寫的,具體取決於是否存在對應的 getter 和 setter 方法。
  • 外掛程式新增至任務的擴充功能。每個擴充功能都以唯讀屬性的形式提供,其名稱與擴充功能相同。
  • 外掛程式新增至任務的慣例屬性。外掛程式可以透過任務的 Convention 物件將屬性和方法新增至任務。此範圍的屬性可能是可讀或可寫的,具體取決於慣例物件。
  • 任務的額外屬性。每個任務物件都維護一個額外屬性的映射。這些是任意的名稱 -> 值對,您可以使用它們將屬性動態新增至任務物件。一旦定義,此範圍的屬性就是可讀寫的。
動態方法

外掛程式 (Plugin) 可以使用其 Convention 物件將方法新增至 任務 (Task)

平行執行

預設情況下,任務不會平行執行,除非任務正在等待非同步工作,並且另一個任務(非相依任務)已準備好執行。當啟動建置時,可以使用 --parallel 旗標啟用平行執行。在平行模式下,不同專案(即多專案建置中)的任務可以平行執行。

屬性

屬性描述
actions

將由此任務執行的 Action 物件序列,依執行順序排列。

ant

此任務的 AntBuilder。您可以在建置檔案中使用它來執行 ant 任務。

convention
已棄用

此任務的 Convention 物件。外掛程式 (Plugin) 可以使用慣例物件為此任務貢獻屬性和方法。

dependsOn

此任務的相依性。

description

此任務的描述。

destroyables

此任務的可銷毀物。

didWork

檢查任務是否實際執行了任何工作。即使任務執行了,它也可能確定它沒有任何事要做。例如,編譯任務可能會確定自上次執行任務以來,原始檔沒有變更。

enabled

傳回此任務是否已啟用。

extensions

擴充功能的容器。

finalizedBy

傳回最終確定此任務的任務。

group

此任務所屬的任務群組。任務群組用於報告和使用者介面中,以便在向使用者呈現任務清單時將相關任務分組在一起。

inputs

此任務的輸入。

localState

此任務的本機狀態。

logger

此任務的記錄器。您可以在建置檔案中使用它來寫入記錄訊息。

logging

LoggingManager,可用於接收記錄並控制此任務的標準輸出/錯誤擷取。預設情況下,System.out 會以 QUIET 記錄層級重新導向至 Gradle 記錄系統,而 System.err 會以 ERROR 記錄層級重新導向。

mustRunAfter

傳回此任務必須在其之後執行的任務。

name

此任務的名稱。名稱在其 專案 (Project) 中唯一識別任務。

outputs

此任務的輸出。

path

任務的路徑,它是任務的完全限定名稱。任務的路徑是其 專案 (Project) 的路徑加上任務的名稱,並以 : 分隔。

project

此任務所屬的 專案 (Project)

shouldRunAfter

傳回此任務應在其之後執行的任務。

state

此任務的執行狀態。這提供有關此任務執行的資訊,例如它是否已執行、已跳過、已失敗等等。

taskDependencies

傳回 TaskDependency,其中包含此任務相依的所有任務。

temporaryDir

傳回此任務可用於寫入暫存檔案的目錄。每個任務實例都提供一個單獨的暫存目錄。不保證此目錄的內容會保留到任務執行結束之後。

timeout

此任務的逾時時間。

方法

方法描述
dependsOn(paths)

將給定的相依性新增至此任務。請參閱此處以取得可用作物為任務相依性的物件類型描述。

doFirst(action)

將給定的閉包新增至此任務動作清單的開頭。執行時,閉包會以此任務作為參數傳遞。

doFirst(actionName, action)

將給定的 Action 新增至此任務動作清單的開頭。

doFirst(action)

將給定的 Action 新增至此任務動作清單的開頭。

doLast(action)

將給定的閉包新增至此任務動作清單的結尾。執行時,閉包會以此任務作為參數傳遞。

doLast(actionName, action)

將給定的 Action 新增至此任務動作清單的結尾。

doLast(action)

將給定的 Action 新增至此任務動作清單的結尾。

doNotTrackState(reasonNotToTrackState)

不要追蹤任務的狀態。

finalizedBy(paths)

為此任務新增給定的最終器任務。

hasProperty(propertyName)

判斷此任務是否具有給定的屬性。請參閱此處以取得任務可用的屬性詳細資訊。

mustRunAfter(paths)

指定此任務必須在所有提供的任務之後執行。

onlyIf(onlyIfClosure)

僅當給定的閉包傳回 true 時,才執行任務。閉包將在任務執行時而非組態期間評估。閉包將傳遞單一參數,即此任務。如果閉包傳回 false,則將跳過任務。

onlyIf(onlyIfReason, onlyIfSpec)
孵化中

僅當給定的規格滿足時,才執行任務。規格將在任務執行時而非組態期間評估。如果規格不滿足,則將跳過任務。

onlyIf(onlyIfSpec)

僅當給定的規格滿足時,才執行任務。規格將在任務執行時而非組態期間評估。如果規格不滿足,則將跳過任務。

property(propertyName)

傳回此任務給定屬性的值。此方法依以下方式查找屬性

setProperty(name, value)

設定此任務的屬性。此方法在以下位置搜尋具有給定名稱的屬性,並在找到屬性的第一個位置設定屬性。

shouldRunAfter(paths)

指定此任務應在所有提供的任務之後執行。

usesService(service)

註冊此任務使用的 BuildService,以便可以遵守 BuildServiceRegistration.getMaxParallelUsages()

腳本區塊

沒有腳本區塊

屬性詳細資訊

List<Action<? super Task>> actions

將由此任務執行的 Action 物件序列,依執行順序排列。

AntBuilder ant (唯讀)

此任務的 AntBuilder。您可以在建置檔案中使用它來執行 ant 任務。

Convention convention (唯讀)

注意:此屬性已棄用,並將在下一個 Gradle 主要版本中移除。

此任務的 Convention 物件。外掛程式 (Plugin) 可以使用慣例物件為此任務貢獻屬性和方法。

Set<Object> dependsOn

此任務的相依性。

String description

此任務的描述。

TaskDestroyables destroyables (唯讀)

此任務的可銷毀物。

boolean didWork

檢查任務是否實際執行了任何工作。即使任務執行了,它也可能確定它沒有任何事要做。例如,編譯任務可能會確定自上次執行任務以來,原始檔沒有變更。

boolean enabled

傳回此任務是否已啟用。

ExtensionContainer extensions (唯讀)

擴充功能的容器。

TaskDependency finalizedBy

傳回最終確定此任務的任務。

String group

此任務所屬的任務群組。任務群組用於報告和使用者介面中,以便在向使用者呈現任務清單時將相關任務分組在一起。

TaskInputs inputs (唯讀)

此任務的輸入。

TaskLocalState localState (唯讀)

此任務的本機狀態。

Logger logger (唯讀)

此任務的記錄器。您可以在建置檔案中使用它來寫入記錄訊息。

LoggingManager logging (唯讀)

LoggingManager,可用於接收記錄並控制此任務的標準輸出/錯誤擷取。預設情況下,System.out 會以 QUIET 記錄層級重新導向至 Gradle 記錄系統,而 System.err 會以 ERROR 記錄層級重新導向。

TaskDependency mustRunAfter

傳回此任務必須在其之後執行的任務。

String name (唯讀)

此任務的名稱。名稱在其 專案 (Project) 中唯一識別任務。

TaskOutputs outputs (唯讀)

此任務的輸出。

String path (唯讀)

任務的路徑,它是任務的完全限定名稱。任務的路徑是其 專案 (Project) 的路徑加上任務的名稱,並以 : 分隔。

Project project (唯讀)

此任務所屬的 專案 (Project)

當啟用組態快取時,不支援從任務動作呼叫此方法。

TaskDependency shouldRunAfter

傳回此任務應在其之後執行的任務。

TaskState state (唯讀)

此任務的執行狀態。這提供有關此任務執行的資訊,例如它是否已執行、已跳過、已失敗等等。

TaskDependency taskDependencies (唯讀)

傳回 TaskDependency,其中包含此任務相依的所有任務。

當啟用組態快取時,不支援從任務動作呼叫此方法。

File temporaryDir (唯讀)

傳回此任務可用於寫入暫存檔案的目錄。每個任務實例都提供一個單獨的暫存目錄。不保證此目錄的內容會保留到任務執行結束之後。

此任務的逾時時間。

  task myTask {
      timeout = Duration.ofMinutes(10)
  }

如果執行任務的時間超過指定的時間量,則執行此任務的執行緒將會中斷。為了使任務能與此功能正常運作,它需要對中斷做出反應,並且必須清理它開啟的任何資源。

預設情況下,任務永遠不會逾時。

方法詳細資訊

Task dependsOn(Object... paths)

將給定的相依性新增至此任務。請參閱此處以取得可用作物為任務相依性的物件類型描述。

Task doFirst(Closure action)

將給定的閉包新增至此任務動作清單的開頭。執行時,閉包會以此任務作為參數傳遞。

Task doFirst(String actionName, Action<? super Task> action)

將給定的 Action 新增至此任務動作清單的開頭。

Task doFirst(Action<? super Task> action)

將給定的 Action 新增至此任務動作清單的開頭。

Task doLast(Closure action)

將給定的閉包新增至此任務動作清單的結尾。執行時,閉包會以此任務作為參數傳遞。

Task doLast(String actionName, Action<? super Task> action)

將給定的 Action 新增至此任務動作清單的結尾。

Task doLast(Action<? super Task> action)

將給定的 Action 新增至此任務動作清單的結尾。

void doNotTrackState(String reasonNotToTrackState)

不要追蹤任務的狀態。

指示 Gradle 將任務視為未追蹤。

Task finalizedBy(Object... paths)

為此任務新增給定的最終器任務。

task taskY {
    finalizedBy "taskX"
}

這裡參閱可用於指定終結器任務的物件類型描述。

boolean hasProperty(String propertyName)

判斷此任務是否具有給定的屬性。請參閱此處以取得任務可用的屬性詳細資訊。

Task mustRunAfter(Object... paths)

指定此任務必須在所有提供的任務之後執行。

task taskY {
    mustRunAfter "taskX"
}

對於每個提供的任務,此動作會新增一個任務「排序 (ordering)」,並且不指定任務之間的「相依性 (dependency)」。因此,即使範例中沒有先執行 'taskX',仍然可以執行 'taskY'。

這裡參閱可用於指定排序關係的物件類型描述。

void onlyIf(Closure<?> onlyIfClosure)

僅當給定的閉包傳回 true 時,才執行任務。閉包將在任務執行時而非組態期間評估。閉包將傳遞單一參數,即此任務。如果閉包傳回 false,則將跳過任務。

您可以新增多個此類謂詞 (predicate)。如果任何謂詞傳回 false,則會略過該任務。

典型用法:myTask.onlyIf { isProductionEnvironment() }

void onlyIf(String onlyIfReason, Spec<? super Task> onlyIfSpec)

注意:此方法為實驗性功能 (incubating),並且在未來 Gradle 版本中可能會變更。

僅當給定的規格滿足時,才執行任務。規格將在任務執行時而非組態期間評估。如果規格不滿足,則將跳過任務。

您可以新增多個此類謂詞 (predicate)。如果任何謂詞傳回 false,則會略過該任務。

典型用法 (來自 Java)

myTask.onlyIf("run only in production environment", new Spec<Task>() {
   boolean isSatisfiedBy(Task task) {
      return isProductionEnvironment();
   }
});

void onlyIf(Spec<? super Task> onlyIfSpec)

僅當給定的規格滿足時,才執行任務。規格將在任務執行時而非組態期間評估。如果規格不滿足,則將跳過任務。

您可以新增多個此類謂詞 (predicate)。如果任何謂詞傳回 false,則會略過該任務。

典型用法 (來自 Java)

myTask.onlyIf(new Spec<Task>() {
   boolean isSatisfiedBy(Task task) {
      return isProductionEnvironment();
   }
});

Object property(String propertyName)

傳回此任務給定屬性的值。此方法依以下方式查找屬性

  1. 如果此任務物件具有給定名稱的屬性,則傳回該屬性的值。
  2. 如果此任務具有給定名稱的擴充功能 (extension),則傳回該擴充功能。
  3. 如果此任務的慣例物件 (convention object) 具有給定名稱的屬性,則傳回該屬性的值。
  4. 如果此任務具有給定名稱的額外屬性 (extra property),則傳回該屬性的值。
  5. 如果找不到,則拋出 MissingPropertyException

void setProperty(String name, Object value)

設定此任務的屬性。此方法在以下位置搜尋具有給定名稱的屬性,並在找到屬性的第一個位置設定屬性。

  1. 任務物件本身。例如,enabled 專案屬性。
  2. 任務的慣例物件 (convention object)。
  3. 任務的額外屬性 (extra properties)。

如果找不到該屬性,則會拋出 MissingPropertyException

TaskDependency shouldRunAfter(Object... paths)

指定此任務應在所有提供的任務之後執行。

task taskY {
    shouldRunAfter "taskX"
}

對於每個提供的任務,此動作會新增一個任務「排序 (ordering)」,並且不指定任務之間的「相依性 (dependency)」。因此,即使範例中沒有先執行 'taskX',仍然可以執行 'taskY'。

這裡參閱可用於指定排序關係的物件類型描述。

void usesService(Provider<? extends BuildService<?>> service)

註冊此任務使用的 BuildService,以便可以遵守 BuildServiceRegistration.getMaxParallelUsages()

對於宣告為 ServiceReference 的任務屬性,這並非必要。