從零開始學(xué)習(xí)Gradle之三---多項(xiàng)目構(gòu)建
1. 多項(xiàng)目定義及結(jié)構(gòu)
在Gradle中,使用文件settings.gradle定義當(dāng)前項(xiàng)目的子項(xiàng)目,格式如下所示:
它表示在當(dāng)前的項(xiàng)目下建立三個子項(xiàng)目,分別為'sub-project1', 'sub-project2', 'sub-project3'。默認(rèn)情況下,每個子項(xiàng)目的名稱對應(yīng)著當(dāng)前操作系統(tǒng)目錄下的一個子目錄。
當(dāng)Gradle運(yùn)行時,會根據(jù)settings.gradle的配置情況,構(gòu)建一個單根節(jié)點(diǎn)的項(xiàng)目樹。其中的每個子節(jié)點(diǎn)代表一個項(xiàng)目(Project),每個項(xiàng)目都有一個唯一的路徑表示它在當(dāng)前樹中的位置,路徑的定義方式類似:
也可以簡寫成“:<Level1-子節(jié)點(diǎn)>:<Level2-子節(jié)點(diǎn)>:<Level3-子節(jié)點(diǎn)>”。借助這種路徑的定義方式,我們可以在build.gradle去訪問不同的子項(xiàng)目。另外,對于單項(xiàng)目,實(shí)際上是一種特殊的、只存在根節(jié)點(diǎn),沒有子節(jié)點(diǎn)的項(xiàng)目樹。
例如,我們有個產(chǎn)品A,包括以下幾個組件core,web,mobile。分別代表"核心邏輯"、"網(wǎng)站"、“手機(jī)客戶端”。 因?yàn)槊總€組件是獨(dú)立的部分,這個時候最好我們能定義多個子項(xiàng)目,讓每個子項(xiàng)目分別管理自己的構(gòu)建。于是我們可以這樣定義A/settings.gradle
按照之前描述的,core組件對應(yīng)A/core目錄,web組件對應(yīng)A/web目錄,mobile組件對應(yīng)A/mobile目錄。接下來,我們就可以在每個組件內(nèi)部,定義build.gradle負(fù)責(zé)管理當(dāng)前組件的構(gòu)建。
Gradle提供了一個內(nèi)建的task 'gradle projects',可以 幫助我們查看當(dāng)前項(xiàng)目所包含的子項(xiàng)目,下面讓我們看看gradle projects的輸出結(jié)果:
:projects
------------------------------------------------------------
Root project
------------------------------------------------------------
Root project 'A'
+--- Project ':core'
+--- Project ':mobile'
\--- Project ':web
結(jié)果一目了然,首先是Root級別的項(xiàng)目A,然后是A下面的子項(xiàng)目'core', 'mobile', 'mobile'
最終的文件以及目錄結(jié)構(gòu)如下所示:
--settings.gradle
--build.gradle
--core
--build.gradle
--web
--build.gradle
--mobile
--build.gradle
如果你不喜歡這種默認(rèn)的結(jié)構(gòu),也可以按照如下方式定義子項(xiàng)目的名稱和物理目錄結(jié)構(gòu):
project(':core').projectDir = new File(settingsDir, 'core-xxx')
include(':web)
project(':web').projectDir = new File(settingsDir, 'web-xxx')
include(':mobile)
project(':mobile').projectDir = new File(settingsDir, 'mobile-xxx')
在這個例子中,子項(xiàng)目core實(shí)際上對應(yīng)的物理目錄為A/core-xxx,web實(shí)際上對應(yīng)的是A/web-xxx,mobile也類似。
雖然我們更改了子項(xiàng)目的物理目錄結(jié)構(gòu),不過由于我們在build.gradle中使用的是類似 “ :<SubProject>”的方式訪問對應(yīng)的子項(xiàng)目,所以目錄結(jié)構(gòu)的改變,對我們Gradle的構(gòu)建腳本并不會產(chǎn)生影響。
接下來,考慮一個更復(fù)雜的情況,隨著產(chǎn)品的發(fā)展,mobile這個組件慢慢的劃分成了Android和IOS兩個部分,這時我們只需要在目錄A/mobile下定義新的settings.gradle,并加入如下部分:
現(xiàn)在,mobile組件下將存在兩個新的子項(xiàng)目 "android"和"ios"
于是,這時候'gradle projects'的目錄結(jié)構(gòu)就變成
--settings.gradle
--core
--build.gradle
--web
--build.gradle
--mobile
--settings.gradle
--ios
--build.gradle
--android
--build.gradle
2. 多項(xiàng)目的集中配置
對于大多數(shù)構(gòu)建工具,對于子項(xiàng)目的配置,都是基于繼承的方式。Gradle除了提供繼承的方式來設(shè)置子項(xiàng)目,還提供了另外一種集中的配置方式,方便我們統(tǒng)一管理子項(xiàng)目的信息。下面看一個例子,打開A/build.gradle,輸入如下部分:
task hello << {task -> println "I'm $task.project.name" }
}
subprojects {
hello << {println "- I am the sub project of A"}
}
project(':core').hello << {
println "- I'm the core component and provide service for other parts."
}
對于上面所示的代碼,已經(jīng)很表意了:
posted on 2012-07-12 21:33 想飛就飛 閱讀(29963) 評論(2) 編輯 收藏 所屬分類: Groovy/Grails