Gradle構建生命週期
瞭解Gradle的整個構建生命週期之前我們需要先了解一下這些概念:
Gradle專案的組成
先來看一個常見的用Gradle構建的Android的專案(比如這個專案叫Search,主要包含一個搜尋library和對library測試的Demo)
Search --demo --src --build.gradle --library --src --build.gradle --build.gradle --setting.gradle
相信這個目錄對大部分android工程師來說都是挺熟悉的。我們來大致看一下Gradle是如何理解這個目錄組織的。
gradle中的工程
其實我們可以認為如果在一個目錄下存在build.gradle檔案,那麼就可以認為這是一個gradle工程(即Project,工程名即目錄的名字)。
build.gradle
主要用於對工程進行配置。比如配置版本、依賴、使用的外掛等等。
根工程與子工程
上面的Search專案有三個工程: Search、demo、library。從目錄結構上看,demo、library好像是Search的子工程,但是如何在gradle中描述這種關係呢?
setting.gradle
setting.gradle
檔案是gradle用來初始化整個構建工程樹的。預設情況下,如果不配置這個檔案,只是在Search目錄下執行構建,那麼gradle是不會去構建demo和library這兩個
專案的。只有在setting.gradle
中配置了這兩個工程,它們才算是Search的子工程。才會參與到Search專案的構建。如何配置呢?
如果demo和library專案的目錄和settings.gralde
是平級的,那麼可以直接這樣配置:
include ':demo',':library'
如果demo和library專案的目錄與settings.gradle
不是平級,或者在其他的地方,那麼就需要指定這兩個工程的目錄:
include ':demo',':library' project(':demo').projectDir = new File('dir path')
Task
舉一個我們經常執行的命令 : gradle build
這裡的build
就是一個task,在gradle中task就是一個操作,比如:打jar包、編譯Java程式碼、上傳jar包到maven。除了這些還有一些比較複雜的task,比如build,它就是由很多task組成的。
一個Project可以包含很多Task。
我們可以在一個工程根目錄下執行gradle tasks
檢視,這個工程包含哪些task。
Gradle的整個構建生命週期
上面我們大體簡單迴歸了一下gradle中基本概念,我們接下來就看一下當我們在工程中敲gradle build
時,gradle是如何對整個工程進行構建的。
在gradle中,整個構建分為3個過程:Initialization、Configuration、Execution,下面就針對這3個階段簡單看一下
Initialization
在初始化階段,gradle要確定的一件比較重要的事是:這次構建是單工程構建還是多工程。即gradle會去尋找settings.grale
檔案, 找的大致邏輯是:
settings.grale
確定好是單工程構建還是多工程構建後就會把參與構建的工程生成Project
物件。
Configuration
在這個階段會對build.gralde
編寫的指令碼進行逐行執行,會進行如下任務
- 載入外掛
- 載入依賴
- 載入task
-
執行指令碼,自定義的外掛DSL程式碼,本身gradle支援的API等
....
Execution
這個階段很簡單,就是執行對應的任務,比如gradle build
關於gradle構建生命週期更細節的一些內容,可以參考官方文件 :ofollow,noindex">https://docs.gradle.org/4.3/userguide/build_lifecycle.html