当前位置: 代码迷 >> java >> Gradle 中的传递 = true 究竟做了什么(wrt crashlytics)?
  详细解决方案

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

热度:32   发布时间:2023-07-17 21:09:36.0

Gradle transitive = true到底做了什么? 并不清楚。 这是在build.gradle compile的上下文中。 就我而言,我依赖于 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 之间发生了变化?

编辑:相关的

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

您可以在官方查看 Gradle 中的依赖管理。 特别是:

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

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

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

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

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

gradle 的默认值是transitive = true

这里的例子和完整解释: :

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

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

话虽如此- 我认为手头更大的问题是您不应该直接引用 Crashlytics 工件 - 您应该使用 Fabric,并因此引入 Crashlytics: ://dev.twitter.com/fabric/

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

Gradle 默认遵循传递依赖。 如果要为特定库关闭它,请使用传递标志。

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

默认情况下, Gradle依赖项是可transitive传递= true )。 Maven存储库中更详细地描述了传递依赖性。 一个模块可能依赖于其他模块,Gradle可以在解析针对存储库的声明的依赖关系时发现这些依赖关系依赖关系。 这几乎总是节省大量时间,但有时它可能会产生问题。

如果依赖于模块A的版本1和模块B的版本2,并且模块A过载依赖于模块B的版本3,则可能不希望Gradle解析该最终依赖关系。 错误的JAR文件版本可能会进入编译或运行时类路径 - 大多数Java开发人员都知道可能会遇到令人沮丧的经历。

令人高兴的是,您可以通过禁用它来改变传递依赖性解决方案:

transitive = false 

来源就

transitive控制传递性。 Gradle 通常默认为可传递的,除非它不传递。 传递性和分类器存在错误,请参阅 。

  相关解决方案