項目構建工具Gradle詳解

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 '構建完成時'
    }
})
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章