首页 文章

Gradle中的transitive = true究竟做了什么(w.r.t. crashlytics)?

提问于
浏览
145

Gradle transitive = true 究竟做了什么?从Gradle documentation不清楚 . 这是在 build.gradle 中的 compile 的上下文中 . 在我的情况下,我'm depending Android'的崩溃 .

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

几个Gradle文档(herehere)暗示"transitive"默认为true . 然而,删除 transitive = true 导致传递的依赖性没有被引入(特别是 KitGroup ) .

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

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

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

Edit :相关Transitive dependencies not resolved for aar library using gradle

6 回答

  • 118

    您正在使用 @aar 表示法 .
    这意味着您只想下载aar工件,而不是依赖项 .
    你可以查看documentation的这一部分:
    检查 1.4.1.2. Artifact only notation 部分:

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

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

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

  • -18

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

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

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

  • 4

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

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

    gradle的默认值为 transitive = true .

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

  • 1

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

  • 1

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

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

  • 5

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

相关问题