配置子項目
Gradle為每個build.gradle都會創(chuàng)建一個相應的Project領(lǐng)域?qū)ο笙ξ牵诰帉慓radle腳本時诲锹,我們實際上是在操作諸如Project這樣的Gradle領(lǐng)域?qū)ο蟆T诙郟roject的項目中涉馅,我們會操作多個Project領(lǐng)域?qū)ο蠊樵啊radle提供了強大的多Project構(gòu)建支持。
要創(chuàng)建多Project的Gradle項目稚矿,我們首先需要在根(Root)Project中加入名為settings.gradle
的配置文件庸诱。settings.gradle
會在 初始化階段 讀取執(zhí)行,所以我們也可以將一些需要在初始化階段執(zhí)行的邏輯放到此處晤揣。
該文件應該包含各個子Project的名稱桥爽。比如,我們有一個根Project名為root-project
昧识,它包含有兩個子Project钠四,名字分別為sub-project1
和sub-project2
,此時對應的文件目錄結(jié)構(gòu)如下:
root-project/
sub-project1/
build.gradle
sub-project2/
build.gradle
build.gradle
settings.gradle
root-project本身也有自己的build.gradle
文件跪楞,同時它還擁有settings.gradle
文件位于和build.gradle
相同的目錄下缀去。此外,兩個子Project也擁有他們自己的build.gradle
文件甸祭。
要將sub-project1
和sub-project2
加入到root-project
的子Project中缕碎,我們需要在settings.gradle
中加入:
include 'sub-project1', 'sub-project2'
多項目構(gòu)建總是需要指定一個樹根,樹中的每一個節(jié)點代表一個項目池户,每一個project對象都指定有一個表示在樹中位置的路徑阎曹。上面例子中把project的路徑作為了include方法的參數(shù),譬如上面的sub-project1
就指定了物理路徑的sub-project1
煞檩。
當然了,設置文件中創(chuàng)建的多項目樹其實是由項目描述符來描述的栅贴,我們可以在設置文件中隨時修改這些描述符≌迮龋現(xiàn)在為root-project
多添加了一個子Project:sub-project3
,但是sub-project3
并不在root-project目錄下檐薯,而是和root-project目錄同級凝赛,應該怎么在settings.gradle
表述呢?
sub-project3/
build.gradle
root-project/
sub-project1/
build.gradle
sub-project2/
build.gradle
build.gradle
settings.gradle
表述方式如下:
rootProject.name = 'root-project'
include 'sub-project1'
include 'sub-project2'
include 'sub-project3'
project(':sub-project3').projectDir = file("$rootDir/../sub-project3")
$rootDir指的是root-project項目所在的目錄坛缕,至于..我覺得是說從rootDir開始找墓猎,一層層找,一直到找到sub-project3為止赚楚。
共享配置
在大型Java項目中毙沾,子項目之間必然具有相同的配置項。我們在編寫代碼時宠页,要追求代碼重用和代碼整潔左胞;而在編寫Gradle腳本時寇仓,同樣需要保持代碼重用和代碼整潔。Gradle 提供了不同的方式使不同的項目能夠共享配置烤宙。
【allprojects】
allprojects是根Project的一個屬性遍烦,在Gradle中,我們可以通過根Project的allprojects()方法將配置一次性地應用于所有的Project躺枕,當然也包括定義Task服猪。比如:
allprojects {
apply plugin: 'idea'
task allTask << {
println project.name
}
}
以上Gradle腳本將閉包中的代碼應用在所有的Project中,包括root-project本身拐云。我們首先將應用了idea Plugin用于生成IntelliJ工程罢猪,其次我們定義了名為allTask的Task,該Task應用于每個Project慨丐,作用是輸出各個Project的名稱坡脐。執(zhí)行“gradle allTask”,命令行輸出如下:
:allTask
root-project
:sub-project1:allTask
sub-project1
:sub-project2:allTask
sub-project2
我們看到房揭,該allTask對于每個Project都執(zhí)行了一次备闲,在執(zhí)行時輸出了當前Project的名稱。
【subprojects】
subprojects和allprojects一樣捅暴,也是父Project的一個屬性恬砂,在父項目的build.gradle腳本里,但subprojects()方法用于配置所有的子Project(不包含根Project)蓬痒。
subprojects {
apply plugin: 'java'
repositories {
mavenCentral()
}
ext {
guavaVersion = ’14.0.1’
junitVersion = ‘4.10’
}
dependencies {
compile(
“com.google.guava:guava:${guavaVersion}”
)
testCompile(
“junit:junit:${junitVersion}”
)
}
task subTask << {
println project.name
}
}
執(zhí)行“gradle subTask”泻骤,命令行輸出如下:
:sub-project1:subTask
sub-project1
:sub-project2:subTask
sub-project2
此時的輸出中不再包含root-project的名字。
此外梧奢,這里還在ext里配置依賴包的版本狱掂,方便以后升級依賴的版本。
【configure】
在項目中亲轨,并不是所有的子項目都會具有相同的配置趋惨,但是會有部分子項目具有相同的配置。Gradle提供的 configure 屬性塊可以讓我們根據(jù)模塊名稱引入特定插件惦蚊。:
configure(allprojects.findAll { it.name.startsWith('sub') }) {
subTask << {
println 'this is a sub project'
}
}
在上面的代碼中器虾,我們先找到所有Project中名字以“sub”開頭的Project,然后再對這些Project進行配置蹦锋,在配置中兆沙,我們向這些Project的subTask中加入了一條額外的打印語句。
此時如果再執(zhí)行“gradle subTask”莉掂,命令行輸出如下:
:sub-project1:subTask
sub-project1
this is a sub project
:sub-project2:subTask
sub-project2
this is a sub project
或者我們可以通過ext定義一個變量再傳入到configure中:
ext.subProjects = allprojects.findAll { it.name.startsWith('sub') }
configure(subProjects) {
apply plugin: 'war'
}
獨享配置
到此為止葛圃,我們所有的Task定義工作都是在root-project中進行的,而sub-project1和sub-project2中的build.gradle文件依然什么都沒有。事實上装悲,我們可以將所有對子Project的配置均放在根Project中進行昏鹃。在上面的例子中,我們通過allprojects()和subprojects()將所有的子Project都包含在了配置之內(nèi)诀诊,其實我們還可以對單個Project進行單獨配置洞渤。比如,在root-project的build.gradle中加入:
project(':sub-project1') {
task forProject1 << {
println 'for project 1'
}
}
以上腳本向sub-project1中加入了名為forProject1的Task属瓣,在執(zhí)行“gradle forProject1”時载迄,終端輸出如下:
:sub-project1:forProject1
for project 1
注意這里子項目名字前面有一個冒號(:)。 通過這種方式抡蛙,指定對應的子項目护昧,并對其進行配置。
(2)我們還可以在每個子項目的目錄里建立自己的構(gòu)建腳本粗截。在上例中惋耙,可以在子項目core目錄下為其建立一個build.gradle文件,并在該構(gòu)建腳本中配置core子項目所需的所有配置熊昌。例如绽榛,在該build.gradle文件中添加如下配置:
ext{
hibernateVersion = ‘4.2.1.Final’
}
dependencies {
compile “org.hibernate:hibernate-core:${hibernateVersion}”
}