Gradle中的transitive = true究竟做了什么(wrt crashlytics)?

Ste*_*Kuo 160 java android gradle crashlytics build.gradle

Gradle transitive = true到底做了什么?Gradle文档中不清楚.这是在上下文compilebuild.gradle.在我的情况下,我依赖于Android的崩溃.

compile('com.crashlytics.sdk.android:crashlytics:2.2.2@aar') {
    transitive = true;
}
Run Code Online (Sandbox Code Playgroud)

几个Gradle文档(此处此处)暗示"传递"默认为true.然而,删除transitive = true导致传递依赖性的结果(特别是KitGroup).

class file for io.fabric.sdk.android.KitGroup not found
Run Code Online (Sandbox Code Playgroud)

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

我正在运行Gradle 2.2.1.也许2.2和2.4之间的行为发生了变化?

编辑:使用gradle未解析aar库的相关传递依赖项

Gab*_*tti 133

您使用的是@aar符号.
这意味着您只想下载aar工件,而不是依赖项.
您可以查看这部分文档:
查看以下1.4.1.2. Artifact only notation部分:

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

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

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

  • 我确认省略@aar并删除传递属性.这里的意图是开发人员明确地引用Fabric工具包(例如,"compile'c​​om.crashlytics.sdk.android:crashlytics:2.5.5'"),并且通过以下方式引入核心io.fabric.sdk.android类传递依赖.如果设置transitive = false,则在编译时将找不到io.fabric.sdk.android.Fabric类. (7认同)
  • 这个"功能"太糟糕了,我想要一个带有依赖关系的aar.没有@aar它会搜索jar和抱怨 (5认同)

Vai*_*den 7

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

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

gradle的默认值为transitive = true

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


Sam*_*zor 5

我的猜测是你手动引用的Crashlytics工件将依赖关系指定为不是传递(transitive=false),这样你就不会被迫默认带来这些依赖关系.这就是为什么你会看到相反的行为.例如,一些开发者可能不想提供所有Google Play服务或Crashlytics可能使用的任何其他内容.

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

话虽这么说 - 我认为手头上更大的问题是你不应该直接引用Crashlytics工件 - 你应该使用Fabric,并因此拉入Crashlytics:https://dev.twitter.com/fabric/ 安卓/整合


Ste*_*Kuo -25

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

  • 我认为你指出一个错误是公平的。但是,您对房产的描述没有帮助。“传递性控制传递性。Gradle 通常默认为传递性,除非它不传递。” 真的吗,伙计?...真的吗? (47认同)
  • @w3bshark 我觉得这很有趣。根据我的经验,“默认为传递性,除非它不传递”是相当准确的。 (6认同)