在Gradle中,transitive = true到底能做什么(wrt crashlytics)?


174

Gradle transitive = true到底做什么?从Gradle文档中尚不清楚。这是在上下文compilebuild.gradle。就我而言,我依赖于Android的crashlytics。

compile('com.crashlytics.sdk.android:crashlytics:2.2.2@aar') {
    transitive = true;
}

一些Gradle文档(此处此处)暗示“可传递”默认为true。然而,删除会transitive = true导致无法引入传递依赖(尤其是KitGroup)。

class file for io.fabric.sdk.android.KitGroup not found

文档说它默认为true,但实际行为似乎相反。

我正在运行Gradle 2.2.1。也许行为在2.2和2.4之间改变了?

编辑不使用gradle为aar库解决相关的传递依存关系


在定义配置或定义依赖项时?
dnault

jar文件的依赖关系被提升为子项目。并非每个项目都需要显式定义其依赖项。
康拉德

本文档中究竟有哪些不清楚的地方?
Oleg Estekhin

3
@OlegEstekhin文档与我看到的运行时行为不匹配
Steve Kuo

Answers:


152

您正在使用@aar符号。
这意味着您只想下载aar工件,而没有依赖项。
您可以检查文档的此部分:
检查1.4.1.2. Artifact only notation部分:

仅工件的符号创建了模块依赖性,该模块依赖性仅下载具有指定扩展名的工件文件。现有模块描述符将被忽略

@aar如果要下载依赖项,请使用表示法,应添加transitive=true

我希望省略@aar可以正常工作而不添加可传递属性。


7
我确认省略@aar并删除可传递属性是可行的。目的是让开发人员显式引用Fabric套件(例如,“ compile'c​​om.crashlytics.sdk.android:crashlytics:2.5.5'”),并通过io.fabric.sdk.android核心类引入传递依赖。如果设置transitive = false,则在编译时将找不到io.fabric.sdk.android.Fabric类。
Mark McClelland

7
这个“功能”太糟糕了,我想要它的依赖项。如果没有@aar,它将搜索jar并抱怨
dowi

12

更一般的注意:transitive = falsecrashlytics库上进行设置会使gradle忽略crashlytics(=“ transient library”)所需的所有库,而不下载并链接它们。

您将不得不手动将所需的库添加到项目中,或者依赖于其他依赖项添加的其他临时库。

gradle的默认值为transitive = true

此处的示例和完整说明:http : //www.devsbedevin.net/android-understanding-gradle-dependencies-and-resolving-conflicts/


链接无效。恐怕默认情况下它不是true,因为在某些情况下具体写为true
Morozov

@Morozov链接已修复。感谢GOTCHA!
Vaiden

5

我的猜测是,您要手动引用的Crashlytics工件将依赖项指定为不可传递(transitive=false),这样就不会在默认情况下强迫您引入这些依赖项。这就是为什么您看到相反的行为。例如,某些开发人员可能不希望引入所有Google Play服务,也可能不希望Crashlytics使用其他任何方式(如果存在)。

因此,通过删除它,Gradle不再获取依赖项,并且无法构建。您可以根据需要手动指定该依赖性。

话虽这么说 -我认为当前更大的问题是您不应该直接引用Crashlytics工件-您应该使用Fabric,并因此引入Crashlytics:https://dev.twitter.com/fabric/ android /集成


迁移到Fabric的说明指定直接引用Crashlytics工件,假定您使用的是Fabric“工具包”:fabric.io/migrations/gradle
Mark McClelland

看起来您打算直接引用这些工具包,并且它们通过传递依赖关系引入io.fabric.sdk.android类。
Mark McClelland

1

设置是否应解决此依赖性,包括或排除其传递性依赖性。属于此依赖关系的工件可能自己也具有与其他工件的依赖关系。后者称为传递依赖。


1

Gradle默认遵循传递依赖。如果您想为特定的库关闭该功能,请使用传递标志。

将过渡标志的值更改为false会阻止下载过渡依赖项,因此您必须自己添加所需的内容。如果只需要一个模块jar,而没有任何其他依赖关系,则也可以指定它。


2
除了高度评价的答案中的建议之外,这还增加了什么价值?
hrbrmstr

-19

transitive控制传递性。Gradle通常默认为可传递的,除非不是这样。与传递性和分类器有关的错误,请参阅https://issues.gradle.org/browse/GRADLE-3188


39
我认为您指出了一个错误是很公平的。但是,您对属性的描述没有帮助。“传递控制传递性。Gradle通常默认为传递,除非不是。” 真的吗,伙计?
w3bshark '16

4
@ w3bshark我认为这很有趣。根据我的经验,“默认为可传递的,除非不是这样”。
纳文

4
@ w3bshark我不太关心选票。我正在与社区分享我学到的东西。
Steve Kuo
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.