簡體   English   中英

模塊之間的依賴性管理

[英]Dependency management between modules

如果我的模塊A和模塊B都需要一個JSON庫(例如GSON),然后我的應用程序C包含模塊A和B。如果模塊A和B都可以得到兩個不同版本的JSON庫B使用不同的版本? 還是gradle會刪除其中之一而只使用其中一個版本?

如果我有更多模塊,將它們更新為使用相同版本的依賴項,該怎么辦似乎需要很多工作。 在這種情況下,讓應用程序C決定要在所有模塊上使用哪個版本會很好(但由於向后兼容,我認為並非總是能正常工作)。 無論如何要實現這一目標?

因此,我的問題是如何最好地處理在許多模塊中非常常見的依賴項。 我是否應該在所有模塊中注入Json包裝器,讓應用程序定義要使用的包裝器?

我想日志記錄可能是類似的依賴

是。 如果在項目A和B中明確要求相同庫的不同版本,則最終可能會得到相同直接依賴項的不同版本。

對於臨時依賴關系,默認行為是基於請求的依賴關系的最新版本。 請介意最新一詞,而不是最高版本。 只要版本與項目實際期望的最低版本向后兼容,就可以了。

幸運的是,gradle有幾種內置方法可以解決依賴項沖突。

我在這里對此主題進行了廣泛的寫作: http : //www.devsbedevin.net/android-understanding-gradle-dependencies-and-resolving-conflicts/

TL; DR

您可以選擇在沖突時失敗:

configurations.all {  
  resolutionStrategy {
    failOnVersionConflict()
  }
}

強制特定依賴項:

configurations.all {  
  resolutionStrategy {
    force 'asm:asm-all:3.3.1', 'commons-io:commons-io:1.4', 'com.parse.bolts:bolts-android:1.+'
  }
}

首選自己的模塊:

configurations.all {  
  resolutionStrategy {
    preferProjectModules()
  }
}

將庫X的所有實例替換為Y(庫,模塊或項目):

configurations.all {  
  resolutionStrategy {
    dependencySubstitution {
      substitute module('commons-io:commons-io:2.4') with project(':my-commons-io')
    }
  }
}

排除特定庫的所有臨時依賴項,並通過手動添加必要的庫:

dependencies {  
    compile('com.android.support:appcompat-v7:23.1.0') {
        transitive = false
    }
}

排除特定的傳遞依賴項:

dependencies {  
    compile('com.android.support:appcompat-v7:23.1.0') {
        exclude group: 'com.parse.bolts'
    }
}

強制項目使用特定版本,而不考慮實際的依賴要求:

dependencies {  
    compile('com.parse.bolts:bolts-android:1.+') {
        force = true
    }
}

考慮具有兩個模塊/項目的Gradle構建。 settings.gradle文件:

include 'modA', 'modB'

假設兩者都使用commons-lang3-3.6 ,而modA使用gson-2.8.1 ,而modB使用gson-2.2.4 可以在根目錄的build.gradle文件中進行配置:

subprojects { p ->
    apply plugin: 'java'

    repositories {
        jcenter()
    }
    dependencies {
        compile 'org.apache.commons:commons-lang3:3.6'
    }

    if (p.name == 'modA') {
        dependencies {
            compile 'com.google.code.gson:gson:2.8.1'
        }
    } else if (p.name == 'modB') {
        dependencies {
            compile 'com.google.code.gson:gson:2.2.4'
        }
    }
}

可以使用以下命令確認所需的配置:

$ gradle :modA:dependencies
$ gradle :modB:dependencies

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM