Gradle中的Transitive=true到底做了什么(W.R.T.Crashlytics)?

Gradletransitive = true到底是做什么的?从Gradle文档中并不清楚。这是在build.gradle内的compile的上下文中。在我的例子中,我依赖于Android的Crashlytics.

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

几个Gradle文档(在这里在这里)暗示“ Transitive ”默认为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库的传递依赖关系

92874 次浏览

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

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

因此,通过删除它,Gradle不再拉入依赖项,并且它无法构建。如果需要,可以手动指定该依赖关系。

话虽如此——我认为当前更大的问题是你不应该直接引用Crashlytics工件——你应该使用织物,并将Crashlytics作为结果拉入:https://dev.twitter.com/fabric/android/integrating

您正在使用@aar表示法。
这意味着您只想下载aar工件,而不想下载传递依赖项。

您可以在Gradle中查看依赖关系管理 在官方文档中。特别是:

仅工件表示法创建仅下载具有指定扩展名的工件文件的模块依赖项。忽略现有的模块描述符

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

我希望在不添加传递性属性的情况下,省略@AAR应该可以工作。

设置是否应解析此依赖项(包括或排除其传递依赖项)。属于此依赖关系的工件本身可能依赖于其他工件。后者称为传递依赖。

默认情况下,Gradle遵循传递依赖关系。如果您想为特定的库关闭它,请使用可传递标志。

将可传递标志的值

更改为false可防止下载可传递依赖项,因此您必须自己添加所需的任何内容。 如果您只需要一个模块JAR,而没有任何额外的依赖项,您也可以指定它。

从更一般的角度来看: 在crashlytics库上设置transitive = false会导致Gradle忽略crashlytics所需的所有库(=“瞬态库”),并且不下载和链接它们。

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

Gradle的默认值是transitive = true

示例和完整解释如下:http://www.devsbedevin.net/android-understanding-gradle-dependencies-and-resolving-conflicts/