1. 程式人生 > >Gradle依賴管理

Gradle依賴管理

1、宣告依賴

依賴屬性

最普遍的依賴稱為外部依賴,這些依賴存放在外部倉庫中。類似Maven,一個外部依賴可以由以下屬性指定:

  • group屬性指定依賴的分組(在Maven中,就是groupId)。

  • name屬性指定依賴的名稱(在Maven中,就是artifactId)。

  • version屬性指定外部依賴的版本(在Maven中,就是version)。

  • classifier: 有時候需要另外一個屬性來進一步的說明,比如說明執行時的環境 (Maven中,就是classifier)。

還有一種常見依賴是檔案依賴,例如

dependencies {
    // //putting all jars from 'libs' onto compile classpath
compile fileTree(include: ['*.jar'], dir: 'libs') //declaring arbitrary files as dependencies compile files('hibernate.jar', 'libs/spring.jar') }

以下是一些依賴配置項:

  • compile是預設的那個,其含義是包含所有的依賴包,即在APK裡,compile的依賴會存在。

  • apk的意思是apk中存在,但是不會加入編譯中,這個貌似用的比較少。

  • provided的意思是提供編譯支援,但是不會寫入apk。

  • testCompile和androidTestCompile會新增額外的library支援針對測試。

理解依賴的API

每個Gradle專案都有一個DependencyHandler的例項,你可以通過getDependencies()方法來獲取依賴處理器的引 用,每一種依賴型別(如外部依賴、檔案依賴等)在依賴處理器中都有一個相對應的方法。每一個依賴都是Dependency的一個例項,group, name, version, 和classifier這幾個屬性用來標識一個依賴,下圖清晰的表示了專案(Project)、依賴處理器(DependencyHandler)和依賴三者之間的關係:
這裡寫圖片描述

2、檢視依賴關係

在檔案目錄下或 Android Studio的 Terminal下敲 gradlew -q app:dependencies 命令,便有以下輸出(部分截圖):

這裡寫圖片描述

(*)星號標記表示是忽略這個依賴的意思,也就是說不去下載這個庫。
(->)箭頭符號表示被強轉變依賴於

gradle對於需要多個版本的依賴庫來說,一般只會下載你配置匯入那個版本,如果沒有手動匯入,那就會下載所有模組依賴的最新版本那個庫,面對多個模組依賴同一個庫,每個模組不都會去下載該依賴庫,而是下載一個該依賴庫,共享給多個模組。

3、依賴衝突

Gradle解決衝突有以下幾種方式

  • (1) 最近版本策略(預設):下載較新版本

  • (2) 衝突失敗策略:發生衝突時,編譯失敗(有些新版本庫並不相容之前的,因此這個庫可以讓開發者主動作出選擇)

  • (3) 強制指定版本策略:發生衝突時,使用開發者指定的版本

排除傳遞依賴的方式有兩種:

  • 1.直接在configuration中排除
configurations {
    compile.exclude module: 'commons'
    all*.exclude group: 'org.gradle.test.excludes', module: 'reports'
}
  • 2.在具體的某個dependency中排除。
compile('org.hibernate:hibernate:3.1') { 
    // 衝突時優先使用該版本 
    force = true 
    // 依據構建名稱排除
    exclude module: 'cglib' 
    // 依據組織名稱排除 
    exclude group: 'org.jmock' 
    // 依據組織名稱+構件名稱排除 
    exclude group: 'org.unwanted', module: 'iAmBuggy' 
    // 為本依賴關閉依賴傳遞特性
    transitive = false 
}
compile("org.springframework:spring-web:4.3.4.RELEASE{
    transitive = false 
}
compile `org.springframework:spring-web:4.3.4.RELEASE@jar`

採用指定 transitive = false 的方式來關閉依賴傳遞特性,也可以採用新增@jar的方式忽略該依賴的所有傳遞性依賴。

exclude可以接收group和module兩個引數,這兩個引數可以單獨使用也可以搭配使用,其中module可以理解為對應GAV中的artifactId,也就是compile group: ‘org.gradle.test.classifiers’, name: ‘service’, version: ‘1.0’中的中間name部分。

4、複製依賴檔案

在build.gradle檔案中加入如下程式碼

configurations {
    //設定後不會複製下層依賴的檔案
    compile.transitive = false
}

task copyAllDependencies(type: Copy) {
    //referring to the 'compile' configuration
    from configurations.compile
    into 'allLibs'
}

執行copyAllDependencies任務後,會將專案所依賴的所有(這裡是第一層依賴的檔案)檔案都複製到allLibs目錄下。

這裡寫圖片描述

5、釋出 artifacts

依賴配置也可以用來發布檔案(這令人困惑)。 我們稱這些檔案publication artifacts, 或者就叫 artifacts。

外掛可以很好的定義一個專案的 artifacts, 所以你並不需要做一些特別的工作來讓 Gradle 需要釋出什麼. 你可以通過在 uploadArchives 任務里加入倉庫來完成. 下面是一個釋出遠端 Ivy 庫的例子:

釋出一個 Ivy 庫

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

現在, 當你運 gradle uploadArchives, Gradle 將構建和上傳你的 Jar。