使用Gradle自定義任務task
黃少存,叩丁狼高階講師,本文為原創文章,轉載請註明出處。
任務是 Gradle 構建中的兩個基本概念之一,而任務的定義和使用有多種形式,以下就給大家介紹幾個task 的定義和使用。
定義任務基本語法
// 使用task 後帶任務名稱 加上執行閉包{}
task t1 {
println 't1'
}
// 任務名稱後加上圓括號
task t2() {
println 't2'
}
// IDEA 重新整理 Task 點選 build 或 左下 Terminal 輸入 gradle build 即可看到結果
t1
t2
以上是任務的基本定義,結果得知會在配置 project 階段時被執行,除了任務依賴,任何涉及到需要配置 project 物件的操作都會被執行。如果需要在任務呼叫時才執行動作程式碼需要定義在 doFirst 或者 doLast 方法中。
任務的常見定義方式
task t1{
// 任務呼叫前執行動作
doFirst{
println 't1'
}
}
// 任務呼叫後執行動作
task t2(){
doLast{
println 't2'
}
}
// << 是 doLast 的簡寫,任務呼叫後執行動作
task t3 << {
println 't3'
}
// 可給任務名帶 ' '
測試:gradle t1 t2 t3
> Task :t1 t1 > Task :t2 t2 > Task :t3 t3
以上為任務的最常見的定義方式,配置project 時不會呼叫 doFirst 和 doLast 中的方法。只有在直接呼叫任務或被其他任務依賴時才會被執行。那這裡說的依賴到底怎麼依賴呢? 以下就來看下任務的依賴配置。
任務的依賴配置 dependsOn
任務的依賴需要使用一個關鍵字 dependsOn 來做依賴配置,配置有多種形式,以下就來給大家演示下常見的用法
task t1 { doFirst { println 't1' } } // 定義任務時指明依賴 task t2(dependsOn : t1) { doLast { println 't2' } } task t3 << { println 't3' } task t4 { dependsOn t3 // 任務內寫依賴 doLast{ println 't4' } } // 外部新增依賴 t1 依賴 t3 t1.dependsOn t4 // 外部增加任務動作達到依賴 t3.doFirst{ println '給 t3 增加增加動作1' } t3 << { println '給 t3 增加增加動作2' }
執行任務 t2 gradle t2 ,結果如下:
> Task :t3
給 t3 增加增加動作1
t3
給 t3 增加增加動作2
> Task :t4
t4
> Task :t1
t1
> Task :t2
t2
以上就是 task 常見的幾種依賴的書寫方式,那 task 還有沒有什麼高階點的語法特性呢?
其實有的,藉助 Groovy 的強大不僅可以定義簡單任務還能做更多的事。例如,可以動態定義任務。
動態任務
4.times {
val ->
task "tk${val}" << {
println "The task is task${val}"
}
}
以上就動態定義了4個任務tk0,tk1,tk2,tk3,那除了動態任務還有哪些高階牛逼的操作呢?其實還可以給任務自定義屬性。
給任務自定義屬性
這裡使用 ext 來給任務新增額外屬性,用 ext.屬性名 = 值
來自定義。
// 給任務新增屬性
task tk5{
ext.myProperty = "The property value"
}
// 獲取自定義屬性
task printTaskProperty << {
println tk5.myProperty
}
// ============== 結果 ===================
> Task : printTaskProperty
The property value
還有木有?
其實任務這裡只是介紹了一些常用的操作而已,想了解更深入的知識點,請期待任務 task 詳講,這裡是帶大家先入門的。
接下來用一個例子來鞏固下任務。
例子
需求:自定義任務來自動生成專案目錄。
// 定義建立目錄的普通方法
def createDir(fileName){
File f = new File(fileName);
f.mkdirs()
}
// 定義生成Java 專案目錄的任務
task createJavaProjectDir << {
def dirList = ['src/main/java','src/main/resources','src/test/java','src/test/resources']
dirList.each {fileName -> createDir(fileName)}
}
// 定義生成 Web 專案目錄的任務
task createWebProjectDir (dependsOn: createJavaProjectDir) << {
def fileName = 'src/main/webapp'
createDir(fileName)
}
其實 Java 元件中已經事先定義好了,咱們只需要直接呼叫就行了。
task createDirs << {
sourceSets*.java.srcDirs*.each{
it.mkdirs()
}
sourceSets*.resources.srcDirs*.each{
it.mkdirs()
}
}
以上就是Gradle 中任務的介紹和任務的實踐。