1. 程式人生 > >Gradle+Groovy提高篇

Gradle+Groovy提高篇

建立自定義任務

開啟build.gradle檔案,並在末尾新增以下內容:

println "1" 
   
task howdy {  
    println "2" 
    doLast {  
        println "Howdy" 
    }  
}  
   
println "3"

這將演示有關Gradle指令碼如何工作的一些資訊。使用以下命令執行它:

./gradlew howdy

您將看到(省略了一些多餘的行):

> Configure project :
1
2
3
 
> Task :howdy
Howdy

在這裡,Configure project任務將生成並執行生成指令碼。在Gradle執行Configure project

任務時,它會執行以下操作:

它打第一個println並列印“1”
它找到要執行的howdy任務定義塊,一個閉包,並顯示“2”。請注意,它不會執行doLast關閉操作,因此尚未列印“Howdy”。
它繼續執行指令碼,直到第四個println,然後列印“3”。
至此,構建指令碼本身已完成對構建環境的配置。下一步是執行命令列中指定的所有任務,在本例中為howdy任務。

這是task.doLast{}執行塊的地方,因此您會在輸出中看到“Howdy”字樣。

doLast是該塊的別稱;它的真正含義是類似於“任務操作”,而外部塊是任務配置。

task howdy {  
    // 始終在初始構建指令碼配置期間執行
    doLast {  
        // 僅在任務本身被呼叫時執行 
    }
    // 始終在初始構建指令碼配置期間執行
} 

使用Graovy DSL根據Gradle文件定義任務的各種方法如下:

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

只是為了錘鍊,在執行構建指令碼時立即執行“配置閉包”,而在doLast專門執行任務時執行在配置閉包中定義的閉包。

將第二個自定義任務新增到build.gradle檔案:

task partner {  
    println "4" 
    doLast {  
        println "Partner" 
    }  
}  
println "5"

如果您./gradlew partner看到的是:

> Configure project :
1
2
3
4
5
 
> Task :partner
Partner

如果您希望一個自定義任務依賴另一個任務怎麼辦?這簡單。build.gradle 在定義兩個自定義任務之後,將以下行新增到檔案中的某處。

partner.dependsOn howdy

並執行:./gradlew partner

...
> Task :howdy
Howdy
 
> Task :partner
Partner

您也可以使用task屬性表示類似的關係finalizedBy。如果將dependsOn行替換為:

howdy.finalizedBy partner

並執行:/gradlew howdy

...
> Task :howdy
Howdy
 
> Task :partner
Partner

您得到相同的輸出。當然,他們表達不同的關係。

關於任務的最後一點:在實踐中,您很少編寫自定義任務來說諸如“Howdy Partner”之類的東西(我很難相信,我知道)。實際上,通常您會覆蓋已經定義的任務型別。例如,Gradle定義了Copy一個將檔案從一個位置複製到另一個位置的任務。

這是一個將文件複製到構建目標的示例:

task copyDocs(type: Copy) {
    from 'src/main/doc'
    into 'build/target/doc'
}

當您意識到build.gradle檔案實際上是一個Groovy指令碼時,就可以使用Groovy和Gradle的真正功能,如果需要,您可以執行任意程式碼來過濾和轉換這些檔案。

下面的任務轉換每個副本檔案並排除.DS_Store檔案。DSL非常靈活。您可以使用from和多個塊excludes,也可以執行諸如重新命名檔案或專門包含檔案之類的操作。再次檢視“複製”任務的文件以獲取更完整的想法。

task copyDocs(type: Copy) {
    from 'src/main/doc'
    into 'build/target/doc'
    eachFile { file ->
        doSomething(file);
    }
    exclude '**/.DS_Store'
}

我在Gradle Jar或中最重視War的任務是負責打包.jar.war檔案以進行最終分發的任務。像Copy任務一樣,他們具有定製過程的非常開放的能力,這對於需要定製最終產品的專案可能是巨大的幫助。實際上,您可以使用Gradle DSL來完全控制打包過程的各個方面。

Spring Boot外掛的bootJarbootWar任務繼承自JarWar任務,因此它們包括所有配置選項,包括複製,過濾和修改檔案的能力以及自定義清單的能力。

提高篇到此結束,大家要是有興趣歡迎去Gradle官網檢視API文件,非常有幫助。


  • 鄭重宣告:文章禁止第三方(騰訊雲除外)轉載、發表,事情原委測試窩,首頁抄我七篇原創還拉黑,你們的良心不會痛嗎?

技術類文章精選

  • java一行程式碼列印心形
  • Linux效能監控軟體netdata中文漢化版
  • 介面測試程式碼覆蓋率(jacoco)方案分享
  • 效能測試框架第二版
  • 如何在Linux命令列介面愉快進行效能測試
  • 圖解HTTP腦圖
  • 將swagger文件自動變成測試程式碼
  • 五行程式碼構建靜態部落格
  • 基於java的直線型介面測試框架初探

非技術文章精選

  • 為什麼選擇軟體測試作為職業道路?
  • 寫給所有人的程式設計思維
  • 成為優秀自動化測試工程師的7個步驟
  • 成為自動化測試的7種技能
  • 自動化測試生命週期
  • 如何在DevOps引入自動化測試
  • Web端自動化測試失敗原因彙總
  • 如何在DevOps引入自動化測試
  • 測試人員如何成為變革的推動者
  • 編寫測試用例的技巧