我正在使用在本地maven存储库上发布的aar。
由于我想要包含传递依赖项,因此我将transitive
属性添加到了我的依赖项中:
compile ('com.mycompany.domain:artifact:1.0.0@aar') {
transitive = true
}
现在,让我们说这个项目添加了对cardView支持库v23的依赖:
compile "com.android.support:cardview-v7:23.4.0"
如果我还在v24 cardView库上添加依赖项,我的apk版本文件会发生什么:
compile "com.android.support:cardview-v7:24.0.0"
Gradle是否能够管理这种双重依赖并采用最新的双依赖而不会产生冲突?或者,在不使用transitive
属性的情况下手动指定依赖项更安全。
此外,transitive
属性是否还会导入aar可能设置的proGuard规则?
感谢您的帮助,
答案 0 :(得分:3)
只是添加一些细节。
您使用的是@aar
表示法
这意味着您只想下载aar工件,而不是依赖项
您可以查看[文档] [1]的这一部分:
查看1.4.1.2. Artifact only notation
部分:
仅工件表示法创建模块依赖项,该依赖项仅下载具有指定扩展名的工件文件。 忽略现有模块描述符。
如果要下载依赖项,请使用@aar
表示法,您应该添加transitive=true
,否则您可以省略@aar,它将在不添加传递属性的情况下工作。
关于依赖性。
Gradle将自动管理依赖项
使用默认配置,gradle将下载最新版本。
在任何情况下,您还可以排除 build.gradle
中的依赖关系。
compile('mylibrary:1.0.0') {
//excluding a particular transitive dependency:
exclude module: 'xxx' //by artifact name
exclude group: 'xxx.xxx' //by group
exclude group: 'xxx.xxxx', module: 'xxxx' //by both name and group
//disabling all transitive dependencies of this dependency
transitive = false
}
答案 1 :(得分:0)
我在Gradle官方文档中找到了答案:Gradle Depedency Management link
Gradle Dependency解算器会自动执行此操作。 Gradle提供的两个主要冲突解决策略是:
最新版本:使用最新版本的依赖项。这是Gradle的默认策略,只要版本向后兼容,它通常是一个合适的选择。
失败:版本冲突会导致构建失败。此策略要求在构建脚本中显式解决所有版本冲突。有关如何明确选择特定版本的详细信息,请参阅ResolutionStrategy。
此外,如果在库中声明了以下声明(see this answer for more details),则应导出规则,导出规则:
defaultConfig {
consumerProguardFiles 'proguard-rules.txt'
}