Gradle任務


Gradle構建指令碼描述一個或多個專案。每個專案都由不同的任務組成。任務是構建執行的一項工作。任務可以是編譯一些類,將類檔案儲存到單獨的目標檔案夾中,建立JAR,生成Javadoc或將一些歸檔發佈到儲存庫。

定義任務

任務是用於將任務定義到構建指令碼中的關鍵字。看看下面的例子,它是一個叫作 hello 的任務,將列印一個字串:hello world。將以下指令碼複製並儲存到 build.gradle 檔案中。 此構建指令碼定義一個名稱為 「hello」 的任務,用於列印hello world字串。

task hello {
   doLast {
      println 'hello world'
   }
}

在儲存 build.gradle 檔案的目錄位置執行以下命令,應該看到輸出結果如下 -

D:/worksp/tw511.com/gradle-3.1/study/script>gradle -q hello
hello world

可以通過為 doLast 語句指定快捷方式(表示符號 <<)來簡化此 hello 任務。如果新增這個快捷方式到上面的 hello 任務中,參考如下指令碼。

task hello << {
   println 'hello world'
}

在儲存 build.gradle 檔案的目錄位置執行以下命令,應該看到輸出結果如下 -

D:/worksp/tw511.com/gradle-3.1/study/script>gradle -q hello
hello world

任務依賴關係

您可能已經猜到,可以宣告依賴於其他任務的任務。下面宣告依賴於其他任務的任務,將以下程式碼複製並儲存到build.gradle檔案中。

task hello << {
    println 'Hello world!'
}
task intro(dependsOn: hello) << {
    println "I'm Gradle"
}

在儲存 build.gradle 檔案的目錄位置執行以下命令,應該看到輸出結果如下 -

D:/worksp/tw511.com/gradle-3.1/study/script>gradle -q intro
Hello world!
I'm Gradle

要新增依賴關係,相應的任務不需要存在。懶依賴 - 其他任務不存在,將以下程式碼複製並儲存到build.gradle檔案中。

task taskX(dependsOn: 'taskY') << {
    println 'taskX'
}
task taskY << {
    println 'taskY'
}

在儲存 build.gradle 檔案的目錄位置執行以下命令,應該看到輸出結果如下 -

D:/worksp/tw511.com/gradle-3.1/study/script>gradle -q taskX
taskY
taskX

定位任務

如果要查詢在構建檔案中定義的任務,則必須使用相應的標準專案屬性。這意味著每個任務都可以作為專案的屬性,使用任務名稱作為屬性名稱。
看看下面的程式碼存取任務作為屬性。將以下程式碼複製並儲存到build.gradle檔案中。

task hello

println hello.name
println project.hello.name

在儲存 build.gradle 檔案的目錄位置執行以下命令,應該看到輸出結果如下 -

D:/worksp/tw511.com/gradle-3.1/study/script>gradle -q hello
hello
hello

您還可以通過任務集合使用所有屬性。
將以下程式碼複製並儲存到build.gradle檔案中。

task hello

println tasks.hello.name
println tasks['hello'].name

在儲存 build.gradle 檔案的目錄位置執行以下命令,應該看到輸出結果如下 -

D:/worksp/tw511.com/gradle-3.1/study/script>gradle -q hello
hello
hello

向任務新增依賴關係

要將一個任務依賴於另一個任務,這意味著當一個任務完成時,另一個任務將開始。 每個任務都使用任務名稱進行區分。 任務名稱集合由其任務集合參照。 要參照另一個專案中的任務,應該使用專案路徑作為相應任務名稱的字首。
以下範例將從任務taskX新增依賴項到任務taskY

task taskX << {
   println 'taskX'
}
task taskY(dependsOn: 'taskX') << {
   println "taskY"
}

在儲存 build.gradle 檔案的目錄位置執行以下命令,應該看到輸出結果如下 -

D:/worksp/tw511.com/gradle-3.1/study/script>gradle -q taskY
taskX
taskY

上面的例子是通過使用名字新增對任務的依賴。 還有另一種方法實現任務依賴性,即使用Task物件定義依賴性。
現在採用上面任務的相同範例,但是使用任務物件而不是任務參考名稱來實現依懶關係。
將以下程式碼複製並儲存到build.gradle檔案中。

task taskY << {
   println 'taskY'
}
task taskX << {
   println 'taskX'
}
taskY.dependsOn taskX

在儲存 build.gradle 檔案的目錄位置執行以下命令,應該看到輸出結果如下 -

D:/worksp/tw511.com/gradle-3.1/study/script>gradle -q taskY
taskX
taskY

還有另一種方法來新增任務依賴,它就是通過使用閉包。在這種情況下,任務通過閉包釋放如果您在構建指令碼中使用閉包,那麼應該返回任務物件的單個任務或集合。以下範例將任務中從taskX新增依賴項到專案中的所有任務,其名稱以「lib」開頭。
將以下程式碼複製並儲存到build.gradle檔案中。

task taskX << {
   println 'taskX'
}

taskX.dependsOn {
   tasks.findAll { 
     task -> task.name.startsWith('lib') 
   }
}
task lib1 << {
   println 'lib1'
}
task lib2 << {
   println 'lib2'
}
task notALib << {
   println 'notALib'
}

在儲存 build.gradle 檔案的目錄位置執行以下命令,應該看到輸出結果如下 -

D:/worksp/tw511.com/gradle-3.1/study/script>gradle -q taskX
lib1
lib2
taskX

向任務新增描述

可以向任務新增描述。 執行Gradle任務時會顯示此描述。 這可以通過使用description關鍵字。
將以下程式碼複製並儲存到build.gradle檔案中。

task copy(type: Copy) {
   description 'Copies the resource directory to the target directory.'
   from 'resources'
   into 'target'
   include('**/*.txt', '**/*.xml', '**/*.properties')
   println("description applied")
}

在儲存 build.gradle 檔案的目錄位置執行以下命令,應該看到輸出結果如下 -

D:/worksp/tw511.com/gradle-3.1/study/script>gradle -q taskX
description applied

跳過任務

如果用於跳過任務的邏輯不能用謂詞表示,則可以使用StopExecutionException。 如果操作丟擲此異常,則會跳過此操作的進一步執行以及此任務的任何後續操作的執行。 構建繼續執行下一個任務。
將以下程式碼複製並儲存到build.gradle檔案中。

task compile << {
    println 'We are doing the compile.'
}

compile.doFirst {
    // Here you would put arbitrary conditions in real life.
    // But this is used in an integration test so we want defined behavior.
    if (true) { throw new StopExecutionException() }
}
task myTask(dependsOn: 'compile') << {
   println 'I am not affected'
}

在儲存 build.gradle 檔案的目錄位置執行以下命令,應該看到輸出結果如下 -

D:/worksp/tw511.com/gradle-3.1/study/script>gradle -q myTask
I am not affected

Gradle在處理任務時有不同的階段。 首先,有一個組態階段,其中直接在任務的閉包中指定的程式碼被執行。 針對每個可用任務執行組態塊,而不僅針對稍後實際執行的那些任務。

參考 -