Gradle任務

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

定義任務

任務是用於將任務定義到構建腳本中的關鍵字。看看下面的例子,它是一個叫作 hello 的任務,將打印一個字符串:hello world。將以下腳本複製並保存到 build.gradle 文件中。 此構建腳本定義一個名稱爲 「hello」 的任務,用於打印hello world字符串。

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

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

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

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

task hello << {
   println 'hello world'
}

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

D:/worksp/yiibai.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/yiibai.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/yiibai.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/yiibai.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/yiibai.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/yiibai.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/yiibai.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/yiibai.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/yiibai.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/yiibai.com/gradle-3.1/study/script>gradle -q myTask
I am not affected

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

參考 -