[英]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/
您可以選擇在沖突時失敗:
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.