Gradle中的transitive = true究竟是做什么的(关于crashlytics)?

Gradle transitive = true什么? 从Gradle文档中不清楚。 这是在build.gradlecompile的上下文中。 在我的情况下,我依靠Android的crashlytics。

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

几个Gradle文档( 这里和这里 )暗示“传递”默认为true。 然而,消除transitive = true依赖不KitGroup (特别是KitGroup )中的transitive = true结果。

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

文件说它默认为真,但实际行为似乎是相反的。

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

编辑 :相关传递依赖没有解决使用gradle aar库

你正在使用@aar符号。
这意味着你只需要下载aar神器,而不需要依赖。
你可以检查这部分的文档 :
检查1.4.1.2. Artifact only notation 1.4.1.2. Artifact only notation部分:

只有工件符号才会创build一个模块依赖关系,只下载具有指定扩展名的工件文件。 现有的模块描述符被忽略

如果你想下载依赖关系,使用@aar符号,你应该添加transitive=true

我希望省略@aar它应该工作,而不添加传递属性。

我的猜测是,你所引用的Crashlytics工件手动指定依赖不是传递的( transitive=false ),所以你不必强迫这些依赖进入默认状态。 这就是为什么你看到相反的行为。 例如,一些开发人员可能不想吸引所有的Google Play服务或Crashlytics可能使用的任何其他服务。

所以,通过删除它,Gradle不再牵扯到依赖关系,并且无法构build。 如果需要,可以手动指定依赖项。

话虽如此,我认为眼前的更大的问题是,你不应该直接引用Crashlytics神器 – 你应该使用Fabric,并且结果引入Crashlytics: https ://dev.twitter.com/fabric/ 安卓/整合

设置是否应该解决这个依赖关系,包括或排除它的传递依赖关系。 属于这个依赖的工件可能会依赖于其他的工件。 后者被称为传递依赖。

Gradle默认遵循传递依赖关系。 如果您想closures某个特定的库,请使用传递标志。

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

更为一般的说明:在crashlytics库上设置transitive = false会导致gradle忽略crashlytics (=“transient libraries”)所需的所有库,而不会下载并链接它们。

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

gradle的默认值是transitive = true

示例和完整的解释在这里: http : //www.devsbedevin.com/android-understanding-gradle-dependencies-and-resolving-conflicts/

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