1. 程式人生 > >使用Gradle自定義任務task

使用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 中任務的介紹和任務的實踐。