天天看點

翻譯:Gradle之依賴管理

原文位址 http://www.gradle.org/docs/current/userguide/artifact_dependencies_tutorial.html

8.1. What is dependency management?何謂?為何?

依賴管理大緻有兩塊:首先Gradle需要找到你工程需要的東西,這些東西就是所謂的“依賴”。另外Gradle需要建構和上傳你工程的産出,這就是所謂的發行。讓我們來仔細看看它們:

大部分工程都不太可能完全自給自足,一把你都會用到其他工程的檔案。比如我工程需要Hibernate就得把它的類庫加進來,比如測試的時候可能需要某些額外jar包(jdbc驅動或者Ehcache jar包)。這些檔案就是工程的依賴。Gradle需要你告訴它工程的依賴是什麼,它們在哪,然後幫你加入建構中。依賴可能需要去遠端庫下載下傳,比如Maven 或者 Ivy 庫。也可以是本地庫,甚至可能是另一個工程。我們稱這個過程叫“依賴解決”(dependency resolution).

通常情況下,依賴本身也有依賴。比如Hibernate核心庫就依賴一些其他類庫。當Gradle測試你工程的時候,它也需要找到這些間接依賴。我們稱之為“傳遞依賴”( transitive dependencies).

大部分工程建構的主要目的是脫離工程使用。比如生成jar包,包括源代碼、文檔等,然後釋出出去。這些個玩意構成了項目的發行内容。Gradle也會替你分憂這個工作。你聲明了要發行,Gradle會建構并且發行。你可能會把檔案拷貝到本地某處,或者上傳到遠端 Maven 或 Ivy 庫,甚至在其他項目裡使用。整個這個都是所謂的發行。

8.2. Declaring your dependencies依賴聲明

我們看一下簡單的依賴聲明腳本:

Example 8.1. Declaring dependencies

build.gradle

apply plugin: 'java'

repositories {
    mavenCentral()
}

dependencies {
    compile group: 'org.hibernate', name: 'hibernate-core', version: '3.6.7.Final'
    testCompile group: 'junit', name: 'junit', version: '4.+'
}      

這是在搞毛?這段腳本說的是:1,工程在編譯時需要Hibernate core 3.6.7.Final。這樣Hibernate核心庫和它的依賴庫都會引入。2,測試的時候需要4.0以上版本的junit。另外就是這些包都要從 Maven central 庫裡查找。接下來咱們詳細看下。

8.3. Dependency configurations依賴配置

Gradle的依賴會分組為“配置”(configurations) 。一個配置就是一套具名依賴,稱為“依賴配置”。你可以聲明外部依賴,後面我們會看到。

Java插件定義了一些标準配置,形成了插件本身的類路徑庫。下面列一下,你可以自己去這看:

Table 23.5, “Java plugin - dependency configurations”

.

compile

該依賴對于編譯發行是必須的。

runtime

該依賴對于運作時是必須的,預設包含編譯時依賴。

testCompile

該依賴對于編譯測試是必須的,預設包含編譯産品依賴和編譯時依賴。

testRuntime

該依賴對于測試是必須的,預設包含編譯、運作時、測試編譯依賴。

定制化配置請看: 

Section 50.3, “Dependency configurations”

8.4. External dependencies外部依賴

依賴類型有多種,現在說一種外部依賴(external dependency)。這種依賴的對象不在工程内,甚至是在遠端庫裡。

定義外部依賴需要如下加入到依賴配置:

Example 8.2. Definition of an external dependency

build.gradle

dependencies {
    compile group: 'org.hibernate', name: 'hibernate-core', version: '3.6.7.Final'
}      

外部依賴使用

group

name

 和

version

 屬性。根據使用庫的不同,

group

version可能是可選的。有一種快捷方式聲明依賴:

Example 8.3. Shortcut definition of an external dependency

build.gradle

dependencies {
    compile 'org.hibernate:hibernate-core:3.6.7.Final'
}      

更多資訊請看 

Section 50.4, “How to declare your dependencies”

8.5. Repositories庫

Gradle是咋定位外部依賴呢?答案是“庫”(repository)。一個庫其實就是一大堆檔案,不過是用

group

name

version組織好的。Gradle支援很多庫,比如

 Maven 和Ivy;還隻存多種方式連接配接到庫,比如本地系統或者 HTTP.

Gradle預設沒定義庫。你使用前需要至少定義一個,比如Maven central 庫:

Example 8.4. Usage of Maven central repository

build.gradle

repositories {
    mavenCentral()
}      

或者遠端Maven 庫:

Example 8.5. Usage of a remote Maven repository

build.gradle

repositories {
    maven {
        url "http://repo.mycompany.com/maven2"
    }
}      

或者遠端 Ivy 庫:

Example 8.6. Usage of a remote Ivy directory

build.gradle

repositories {
    ivy {
        url "http://repo.mycompany.com/repo"
    }
}      

你可以自己建個庫然後指定:

Example 8.7. Usage of a local Ivy directory

build.gradle

repositories {
    ivy {
        // URL can refer to a local directory
        url "../local-repo"
    }
}      

工程裡可以制定多個庫,Gradle會依序查找,一旦找到就停止。更多資訊請看 

Section 50.6, “Repositories”

8.6. Publishing artifacts釋出檔案

依賴配置也用來釋出檔案,這些檔案稱為“釋出檔案”(publication artifacts),或幹脆就叫“發件”(artifacts)(不會翻譯,誰來糾正一下。。)

一般的,插件會做很多發件定義工作,是以我們不用幹什麼。不過需要告訴Gradle發件要釋出到哪裡。方法是把庫附在 

uploadArchives

 任務裡。比如我們要釋出到遠端Ivy庫:

Example 8.8. Publishing to an Ivy repository

build.gradle

uploadArchives {
    repositories {
        ivy {
            credentials {
                username "username"
                password "pw"
            }
            url "http://repo.mycompany.com"
        }
    }
}      

現在你執行 

gradle uploadArchives

, Gradle就會建構并上次你的Jar包,同時生成并上傳一個

ivy.xml

 檔案.

可以釋出到Maven 庫,文法有一點點不同。記住要使用Maven插件不然釋出不過去。這樣Gradle會生成并上傳

pom.xml檔案。

Example 8.9. Publishing to a Maven repository

build.gradle

apply plugin: 'maven'

uploadArchives {
    repositories {
        mavenDeployer {
            repository(url: "file://localhost/tmp/myRepo/")
        }
    }
}      

更多關于釋出的資訊請看 

Chapter 51, Publishing artifacts