到目前為止你已經(jīng)把ToDo項(xiàng)目根據(jù)功能拆分成多個模塊,接下來可以用之前的方法來定義構(gòu)建邏輯,下面有幾點(diǎn)需要主要:
接下來你將學(xué)習(xí)如何定義特定的和共有的構(gòu)建邏輯,怎么樣去避免重復(fù)的配置。有些子項(xiàng)目可能依賴其他項(xiàng)目的源代碼,比如repository項(xiàng)目依賴model項(xiàng)目,通過聲明項(xiàng)目依賴可以避免拷貝源代碼。
之前我介紹過項(xiàng)目Project可能會用到的一些API,接下來還有一些API用在多項(xiàng)目構(gòu)建中。project方法用于聲明指定項(xiàng)目的構(gòu)建代碼,需要提供項(xiàng)目的路徑,比如:model。有時候你想給所有的項(xiàng)目或者只有子項(xiàng)目定義一些邏輯,你可以使用allprojects和subprojects方法,比如你想給所有的子項(xiàng)目添加Java插件,你需要使用subprojects方法。
http://wiki.jikexueyuan.com/project/gradleIn-action/images/dag43.png" alt="" />
指定項(xiàng)目的行為通過project方法來定義,為了給三個子項(xiàng)目model、repository、web定義構(gòu)建邏輯,你需要給它們分別創(chuàng)建一個配置塊。下面build.gradle文件:
ext.projectIds = ['group': 'com.manning.gia', 'version': '0.1']
group = projectIds.group
version = projectIds.version
project(':model') {
group = projectIds.group
version = projectIds.version
apply plugin: 'java'
}
project(':repository') {
group = projectIds.group
version = projectIds.version
apply plugin: 'java'
}
project(':web') {
group = projectIds.group
version = projectIds.version
apply plugin: 'java'
apply plugin: 'war'
apply plugin: 'jetty'
repositories {
mavenCentral()
}
dependencies {
providedCompile 'javax.servlet:servlet-api:2.5'
runtime 'javax.servlet:jstl:1.1.2'
}
}
從整個項(xiàng)目的根目錄那里,你可以執(zhí)行子項(xiàng)目的任務(wù),需要記住項(xiàng)目路徑是通過冒號分隔,比如你想執(zhí)行model子項(xiàng)目的build任務(wù),在命令行中執(zhí)行g(shù)radle :modle:build就可以,如下所示:
$ gradle :model:build
:model:compileJava
:model:processResources UP-TO-DATE
:model:classes
:model:jar
:model:assemble
:model:compileTestJava UP-TO-DATE
:model:processTestResources UP-TO-DATE
:model:testClasses UP-TO-DATE
:model:test
:model:check
:model:build
聲明項(xiàng)目依賴和聲明外部依賴非常類似,只需要在dependencies配置塊中聲明,如下所示:
project(':model') {
...
}
project(':repository') {
...
dependencies {
//聲明編譯期依賴項(xiàng)目model
compile project(':model')
}
}
project(':web') {
...
dependencies {
//聲明編譯期依賴項(xiàng)目repository
compile project(':repository')
providedCompile 'javax.servlet:servlet-api:2.5'
runtime 'javax.servlet:jstl:1.1.2'
}
}
這樣就定義了我們的項(xiàng)目依賴,注意當(dāng)一個項(xiàng)目依賴于另一個項(xiàng)目時,另一個項(xiàng)目的項(xiàng)目依賴和外部依賴同樣會被添加進(jìn)來,在構(gòu)建周期的初始化階段,Gradle決定項(xiàng)目的執(zhí)行順序。
從根目錄的執(zhí)行順序是這樣的:
http://wiki.jikexueyuan.com/project/gradleIn-action/images/dag44.png" alt="" />
有時候你并不需要重新構(gòu)建那些并未改變的項(xiàng)目,Gradle提供了部分構(gòu)建partial builds的選項(xiàng),通過命令行選項(xiàng)-a或者--no-rebuild。比如你只改變了repository項(xiàng)目不想重新構(gòu)建model子項(xiàng)目,你可以這樣做:gralde :repository:build -a,如下所示:
$ gradle :repository:build -a
:repository:compileJava
:repository:processResources UP-TO-DATE
:repository:classes
:repository:jar
:repository:assemble
:repository:compileTestJava UP-TO-DATE
:repository:processTestResources UP-TO-DATE
:repository:testClasses UP-TO-DATE
:repository:test
:repository:check
:repository:build
上面你在所有的子項(xiàng)目中添加了Java插件,給所有的項(xiàng)目添加了一個外部屬性ProjectIds,當(dāng)你的子項(xiàng)目變得比較多的時候這樣子做可能是個問題,接下來你可以通過allprojects和subprojects方法來改善你的構(gòu)建代碼。
http://wiki.jikexueyuan.com/project/gradleIn-action/images/dag45.png" alt="" />
這是什么意思?這意味著你可以用allprojects方法給所有的項(xiàng)目添加group和version屬性,由于根項(xiàng)目不需要Java插件,你可以使用subprojects給所有子項(xiàng)目添加Java插件,如下所示:
allprojects {
group = 'com.manning.gia'
version = '0.1'
}
subprojects {
apply plugin: 'java'
}
project(':repository') {
dependencies {
compile project(':model')
}
}
project(':web') {
apply plugin: 'war'
apply plugin: 'jetty'
repositories {
mavenCentral()
}
dependencies {
compile project(':repository')
providedCompile 'javax.servlet:servlet-api:2.5'
runtime 'javax.servlet:jstl:1.1.2'
}
}