DSL配置block dependencies用來給配置添加一個或多個依賴,你的項目不僅可以添加外部依賴,下面這張表顯示了Gradle支持的各種不同類型的依賴。
http://wiki.jikexueyuan.com/project/gradleIn-action/images/5-3.png" alt="" />
這一章直接掃外部模塊依賴和文件依賴,我們來看看Gradle APi是怎么表示依賴的。
理解依賴的API表示
每個Gradle項目都有一個DependencyHandler的實例,你可以通過getDependencies()方法來獲取依賴處理器的引用,上表中每一種依賴類型在依賴處理器中都有一個相對應(yīng)的方法。每一個依賴都是Dependency的一個實例,group, name, version, 和classifier這幾個屬性用來標(biāo)識一個依賴,下圖清晰的表示了項目(Project)、依賴處理器(DependencyHandler)和依賴三者之間的關(guān)系:
http://wiki.jikexueyuan.com/project/gradleIn-action/images/5-4.png" alt="" />
在Gradle的術(shù)語里,外部庫通常是以JAR文件的形式存在,稱之為外部模塊依賴,代表項目層次外的一個模塊,這種類型的依賴是通過屬性來唯一的標(biāo)識,接下來我們來介紹每個屬性的作用。
依賴屬性
當(dāng)依賴管理器從倉庫中查找依賴時,需要通過屬性的結(jié)合來定位,最少需要提供一個name。
依賴的寫法
你可以使用下面的語法在項目中聲明依賴:
dependencies {
configurationName dependencyNotation1, dependencyNotation2, ...
}
你先聲明你要給哪個配置添加依賴,然后添加依賴列表,你可以用map的形式來注明,你也可以直接用冒號來分隔屬性,比如這樣的:
http://wiki.jikexueyuan.com/project/gradleIn-action/images/5-5.png" alt="" />
//聲明外部屬性
ext.cargoGroup = 'org.codehaus.cargo'
ext.cargoVersion = '1.3.1'
dependencies {
//使用映射聲明依賴
compile group: cargoGroup, name: 'cargo-core-uberjar',version: cargoVersion
//用快捷方式來聲明,引用了前面定義的外部屬性
cargo "$cargoGroup:cargo-ant:$cargoVersion"
}
如果你項目中依賴比較多,你把一些共同的依賴屬性定義成外部屬性可以簡化build腳本。
Gradle沒有給項目選擇默認的倉庫,當(dāng)你沒有配置倉庫的時候運行deployTOLocalTomcat任務(wù)的時候回出現(xiàn)如下的錯誤:
$ gradle deployToLocalTomcat
:deployToLocalTomcat FAILED
FAILURE: Build failed with an exception.
Where: Build file '/Users/benjamin/gradle-in-action/code/chapter5/cargo-configuration/build.gradle' line: 10
What went wrong:
Execution failed for task ':deployToLocalTomcat'.
> Could not resolve all dependencies for configuration ':cargo'.
> Could not find group:org.codehaus.cargo, module:cargo-core-uberjar, version:1.3.1.
Required by:
:cargo-configuration:unspecified
> Could not find group:org.codehaus.cargo, module:cargo-ant,version:1.3.1.
Required by:
:cargo-configuration:unspecified
到目前為止還沒講到怎么配置不同類型的倉庫,比如你想使用MavenCentral倉庫,添加下面的配置代碼到你的build腳本中:
repositories {
mavenCentral()
}
檢查依賴報告
當(dāng)你運行dependencies任務(wù)時,這個依賴樹會打印出來,依賴樹顯示了你build腳本聲明的頂級依賴和它們的傳遞依賴:
http://wiki.jikexueyuan.com/project/gradleIn-action/images/5-6.png" alt="" /> http://wiki.jikexueyuan.com/project/gradleIn-action/images/5-7.png" alt="" />
仔細觀察你會發(fā)現(xiàn)有些傳遞依賴標(biāo)注了*號,表示這個依賴被忽略了,這是因為其他頂級依賴中也依賴了這個傳遞的依賴,Gradle會自動分析下載最合適的依賴。
排除傳遞依賴
Gradle允許你完全控制傳遞依賴,你可以選擇排除全部的傳遞依賴也可以排除指定的依賴,假設(shè)你不想使用UberJar傳遞的xml-api的版本而想聲明一個不同版本,你可以使用exclude方法來排除它:
dependencies {
cargo('org.codehaus.cargo:cargo-ant:1.3.1') {
exclude group: 'xml-apis', module: 'xml-apis'
}
cargo 'xml-apis:xml-apis:2.0.2'
}
exclude屬性值和正常的依賴聲明不太一樣,你只需要聲明group和(或)module,Gradle不允許你只排除指定版本的依賴。
有時候倉庫中找不到項目依賴的傳遞依賴,這會導(dǎo)致構(gòu)建失敗,Gradle允許你使用transitive屬性來排除所有的傳遞依賴:
dependencies {
cargo('org.codehaus.cargo:cargo-ant:1.3.1') {
transitive = false
}
// 選擇性的聲明一些需要的庫
}
動態(tài)版本聲明
如果你想使用一個依賴的最新版本,你可以使用latest.integration,比如聲明 Cargo Ant tasks的最新版本,你可以這樣寫 org.codehaus .cargo:cargo-ant:latest-integration
,你也可以用一個+號來動態(tài)的聲明:
dependencies {
//依賴最新的1.x版本
cargo 'org.codehaus.cargo:cargo-ant:1.+'
}
Gradle的dependencies任務(wù)可以清晰的看到選擇了哪個版本,這里選擇了1.3.1版本:
$ gradle –q dependencies
------------------------------------------------------------
Root project
------------------------------------------------------------
Listing 5.4 Excluding a single dependency
Listing 5.5 Excluding all transitive dependencies
Listing 5.6 Declaring a dependency on the latest Cargo 1.x version
Exclusions can be
declared in a shortcut
or map notation.
120 CHAPTER 5 Dependency management
cargo - Classpath for Cargo Ant tasks.
\--- org.codehaus.cargo:cargo-ant:1.+ -> 1.3.1
\--- ...
如果你沒有使用自動的依賴管理工具,你可能會把外部庫作為源代碼的一部分或者保存在本地文件系統(tǒng)中,當(dāng)你想把項目遷移到Gradle的時候,你不想去重構(gòu),Gradle很簡單就能配置文件依賴。下面這段代碼復(fù)制從Maven中央倉庫解析的依賴到libs/cargo目錄。
task copyDependenciesToLocalDir(type: Copy) {
//Gradle提供的語法糖
from configurations.cargo.asFileTree
into "${System.properties['user.home']}/libs/cargo"
}
運行這個任務(wù)之后你就可以在依賴中聲明Cargo庫了,下面這段代碼展示了怎么給cargo配置添加JAR文件依賴:
dependencies {
cargo fileTree(dir: "${System.properties['user.home']}/libs/cargo",include: '*.jar')
}