提问人:Goltsev Eugene 提问时间:9/8/2022 更新时间:9/8/2022 访问量:628
Android Gradle - 传递依赖项优先(升级)声明的(一级)依赖项
Android Gradle - transitive dependencies take precedence (upgrade) the declared (first-level) one
问:
我有什么 :build.gradle
implementation "androidx.recyclerview:recyclerview:1.1.0"
implementation 'com.github.kirich1409:viewbindingpropertydelegate-noreflection:1.5.6'
后一种依赖关系有其自己的传递依赖关系:RecyclerView
implementation "androidx.recyclerview:recyclerview:1.2.1"
然后我在依赖关系树中看到的是(对于我声明的依赖关系):RecyclerView
+--- androidx.recyclerview:recyclerview:1.1.0 -> 1.2.1
另外,在代码中,我得到了 1.1.0 之后出现的方法。getBindingAdapterPosition
当然,我们应该始终尝试使用最新版本的依赖项,但这是正确的行为吗?!
我以为传递依赖关系不会覆盖声明的依赖关系。
如果我的代码仅依赖于版本 1.1.0 中的某些功能,该怎么办?
答:
1赞
Gabriele Mariotti
9/8/2022
#1
文档中描述了默认行为:
Gradle 通过选择在依赖关系图中找到的最新版本来解决任何依赖关系版本冲突。
可以强制执行特定版本的传递依赖项,但不包括依赖项。像这样:
implementation('commons-beanutils:commons-beanutils:1.9.4') {
exclude group: 'commons-collections', module: 'commons-collections'
}
但请注意:
完全排除依赖关系需要有意识的决定。如果外部库没有传递依赖项就无法正常运行,则排除传递依赖项可能会导致运行时错误。如果使用 excludes,请确保不使用任何代码路径,通过足够的测试覆盖率来要求排除依赖项。
您也可以使用严格版本,即使传递依赖项另有说明。像这样:
implementation('commons-codec:commons-codec') {
version {
strictly '1.9'
}
}
在这种情况下,还要注意:
强制使用依赖项的某个版本需要有意识地做出决定。如果外部库没有外部库就无法正常运行,则更改传递依赖项的版本可能会导致运行时错误。
评论