1、Gradle介紹
簡單的說,Gradle就是用來構建項目的一個工具。
- 基於JVM
- 像Ant一樣通用靈活
- 像Maven一樣約定優於配置
- 支持多工程構建
- 強大的依賴管理(基於Apache Ivy)
- 對已有的maven和ivy倉庫全面支持
- 支持傳遞性依賴管理,在不需要遠程倉庫和pom.xml和ivy配置文件的前提下
- 基於groovy腳本構建,其build腳本使用groovy語言編寫
2、Ant、Maven、Gradle比較
創世之初,世上只有Make一種構建工具,後來,其發展爲GNU Make。後來由於技術的不斷髮展,JVM生態圈裏出現了三個最流行的構建工具:
- Ant
Ant是第一個“現代”構建工具,在很多方面它有些像Make。
Ant的優點是上手比較快,對構建過程的控制直觀透明。
Ant的不足在於使用XML作爲腳本編寫格式,XML本質是層次化的,並不能很好地貼合Ant過程化編程的初衷,在Ant裏要表達一個if分支持功能非常的麻煩;項目一大起來,XML文件很快大的無法管理。
Ant一開始沒有通過網絡進行依賴管理的功能,直到採用了Apache Ivy。 - Maven
Maven主要聚焦於依賴管理,實際上用Maven很難寫出複雜、定製化的構建腳本,甚至不如Ant。
用XML寫的配置文件會變得越來越大,越來越笨重。
Maven的主要優點是生命週期。只要項目基於一定之規,它的整個生命週期都能夠輕鬆搞定,代價是犧牲了靈活性。 - Gradle
Gradle結合了前兩者的優點,在此基礎之上做了很多改進。它具有Ant的強大和靈活,又有Maven的生命週期管理且易於使用。
Gradle不用XML,它使用基於Groovy的專門的DSL,從而使Gradle構建腳本變得比用Ant和Maven寫的要簡潔清晰。
它使用Apache Ivy來處理Jar包的依賴。
Gradle的成就可以概括爲:約定好,靈活性也高。
3、Gradle相關的文件
- settings.gradle
這個文件是用來告訴gradle工具你的工程包含了幾個模塊。
示例:include ':app',':library'
你可以指定模塊的路徑。
示例:project(':app').projectDir = new File('path')
- gradle-wrapper.properties
這個文件位於工程根目錄下的build/wrapper
目錄下,通過修改gradle-wrapper.properties
文件中的distributionUrl
,可以指定需要下載的gradle版本;
下載的功能是通過另外一個文件gradle-wrapper.jar
完成的。 - gradle.properties
一個配置文件,裏面可以定義一些常量。 - gradlew和gradlew.bat
分別是linux下的shell腳本和windows下的批處理文件,它們的作用是根據gradle-wrapper.properties文件中的distributionUrl下載對應的gradle版本。這樣就可以保證在不同的環境下構建時都是使用的統一版本的gradle,即使該環境沒有安裝gradle也可以,因爲gradle wrapper會自動下載對應的gradle版本。 - build.gradle
進行工程打包的一些配置,這裏就不贅述了。
4、Gradle任務
1. 創建一個任務
task helloTask{
println '在這裏進行任務配置'
doFirst{
println '任務執行前做的事'
}
doLast{
println '任務執行後做的事'
}
}
2. 任務依賴
假設現在我們已經創建好了TaskA、TaskB、TaskC。
- dependsOn
TaskC dependsOn TaskA, TaskB
這裏表示TaskA和TaskB會先執行,然後再執行任務TaskC。
- shouldRunAfter
TaskA和TaskB哪個先執行是不一定的。
taskB.shouldRunAfter TaskA
taskA先於TaskB執行。
- finalizedBy
我們再新建一個任務TaskD。
taskC finalizedBy TaskD
當我們執行任務taskC時,任務的執行順序是TaskA->TaskB->TaskC->TaskD。
5、Gradle生命週期
先讀取settings.gradle
,然後是頂層的build.gradle
,最後是各個模塊的build.gradle
。
project.beforeEvaluate {
println '在讀取build.gradle文件前'
}
project.afterEvaluate {
println '在讀取build.gradle文件後'
}
project.getGradle().addBuildListener(new BuildListener() {
@Override
void buildStarted(Gradle gradle) {
println '構建開始時'
}
@Override
void settingsEvaluated(Settings settings) {
println '讀取settings.gradle的時候'
}
@Override
void projectsLoaded(Gradle gradle) {
println '模塊加載時'
}
@Override
void projectsEvaluated(Gradle gradle) {
println '讀取模塊配置時'
}
@Override
void buildFinished(BuildResult buildResult) {
println '構建完成時'
}
})