Gradle之多專案構建

MrChenUpUp發表於2018-09-17

Gradle對構建模組化專案提供了強大的支援,在Gradle中每一個模組都是一個專案,稱之為Gradle多專案構建技術,多專案構建實現了專案模組化,降低程式碼耦合度,增加內聚性,本篇文章將簡單介紹如何使用Gradle進行多專案構建。

1、組裝多專案構建:Gradle整個專案是由一個根目錄和多個模組的子目錄構成,在根目錄下新建build.gradle構建指令碼,使用gradle projects命令檢視所有參與構建的專案:

> Task :projects 
//只有一個根專案,無子專案
------------------------------------------------------------
Root project
------------------------------------------------------------
Root project 'root'
No sub-projects

示例中使用的多專案層次結構如下圖,定義了3個子專案:
這裡寫圖片描述

①settings檔案介紹:使用過Gradle構建專案的都應該知道這個檔案,該檔案宣告瞭專案層次結構所需的配置。預設情況下,這個檔案被命名為settings.gradle,並且和根專案的build.gradle檔案放在一起。簡單配置settings.gradle檔案:

//settings.gradle指令碼:
include 'model'
include 'repository', 'web'

//再次執行gradle projects命令,可以看出多了3個子專案:
> Task :projects 
------------------------------------------------------------
Root project
------------------------------------------------------------
Root project 'root'
+--- Project ':model'
+--- Project ':repository'
\--- Project ':web'

②settings API的理解:Gradle在組裝構建之前,會建立一個Settings例項,Settings介面是settings檔案的直接表示,它的主要作用就是新增Project例項參與多專案構建,下圖顯示了Settings介面的相關方法:
這裡寫圖片描述

我們可以在settings.gradle檔案中直接使用這些相關的API進行編碼,例如呼叫了include(String)方法將子專案新增到多專案的構建中。

③settings執行的階段:在介紹task的使用時說到了構建過程的三個生命週期:初始化、配置和執行。那麼是在哪個階段解析執行settings檔案中的程式碼的呢?可以想到的是,它肯定是在Project例項配置之前進行例項化的:
這裡寫圖片描述

④如何找到settings檔案只要根專案或者任何子專案的目錄中包含構建檔案,Gradle就執行你從相應的位置執行構建。 Gradle是如何知道一個子專案是一個多專案構建的一部分的呢?它需要找到settings檔案,這個檔案指示了子專案是否包含在多專案構建中。步驟:①首先Gradle在與當前目錄同層次的master目錄下搜尋settings檔案,②找不到則在父目錄下查詢settings檔案,下圖分別對應這兩種情況:
這裡寫圖片描述

⑤專案的兩種佈局:分層佈局和平面佈局,android專案中使用的就是分層佈局。對於平面佈局來說,要想包括與根專案同一巢狀層次的專案,需要使用includeFlat方法,下圖分別對應的是分層佈局和平面佈局:
這裡寫圖片描述

2、子專案的構建檔案:每個子專案的構建需要在子專案的目錄下新建一個build.gradle構建指令碼,該目錄樹如下圖:
這裡寫圖片描述

①根專案構建指令碼

/**為所有專案(包括根專案和所有子專案)設定group和version屬性*/
allprojects {
    group = 'com.manning.gia'
    version = '0.1'
}
/**所有子專案應用Java外掛*/
subprojects {
    apply plugin: 'java'
}

②子專案構建指令碼:一般在子專案構建指令碼中不宣告任何程式碼也是可以的,除非有一些其它的需求,例如web子專案的構建指令碼如下:

/**應用war外掛*/
apply plugin: 'war'
/**宣告中心倉庫*/
repositories {
    mavenCentral()
}
dependencies {
    /**定義依賴了repository子專案*/
    compile project(':repository')
}

3、定義不同的構建指令碼名稱:標準的Gradle構建檔名是build.gradle,但是也許有必要使用一些更具有表達性的名稱來命名構建檔案。想使用自定義的構建指令碼檔名,關鍵在於settings檔案。假如專案結構如下圖:
這裡寫圖片描述

include 'todo-model', 'todo-repository', 'todo-web'

/**更改構建檔案,將build.gradle 更換成更有意義的命名,如 model.gradle
 * it.name 是子專案名:todo-model todo-repository todo-web*/
rootProject.children.each {
    /**設定構建指令碼檔名*/
    it.buildFileName = it.name + '.gradle' - 'todo-'
}

以上簡單介紹多專案構建的原理,settings檔案如何實現基本的配置,如何是一個專案作為子專案新增到構建中等。還是那句話,知其所以然能夠讓你得心應手。

相關文章