【问题标题】:Library dependency issues with gradle 3.0.0-alphaXgradle 3.0.0-alphaX 的库依赖问题
【发布时间】:2017-08-01 20:32:17
【问题描述】:

我有一个带有子模块的库项目,其中包含许多我想传递给开发人员应用程序的依赖项。例如,模块 A 可能包含所有必要的 appcompat 依赖项。

使用migration changes,我已将所有compile 案例更新为api,这不会影响任何事情。但是,我不再有权访问任何库依赖项。我只能使用我的库本身的代码和引用。

有没有办法解决这个问题?

我的库子模块的构建 gradle 文件之一可以在here 找到以供参考。

依赖关系:

dependencies {
    api "org.jetbrains.kotlin:kotlin-stdlib:${KOTLIN}"

    api "com.android.support:appcompat-v7:${ANDROID_SUPPORT_LIBS}"
    api "com.android.support:support-v13:${ANDROID_SUPPORT_LIBS}"
    api "com.android.support:design:${ANDROID_SUPPORT_LIBS}"
    api "com.android.support:recyclerview-v7:${ANDROID_SUPPORT_LIBS}"
    api "com.android.support:cardview-v7:${ANDROID_SUPPORT_LIBS}"
    api "com.android.support.constraint:constraint-layout:${CONSTRAINT_LAYOUT}"

    api "com.mikepenz:iconics-core:${ICONICS}@aar"
    api "com.mikepenz:google-material-typeface:${IICON_GOOGLE}.original@aar"

    api "com.afollestad.material-dialogs:core:${MATERIAL_DIALOG}"

    api "com.jakewharton.timber:timber:${TIMBER}"

    api "org.jetbrains.anko:anko-commons:${ANKO}"
}

编辑:

为了澄清,模块中的示例项目实际上确实可以正确构建,但是在任何其他应用程序中使用依赖项时都会出现问题,它是从 jitpack 中提取的。请参阅 this gradle 作为不会构建的示例。 我尝试过使用 api、实现、@aar 和传递的组合。

想一想,这可能是 jitpack 问题而不是 gradle 问题,但如果其他人有解决方案,我想听听。

【问题讨论】:

  • 我对 bazel 有这个问题。不确定如何使用 gradle 解决此问题,但您可以使用关键字“瞬态依赖项”进行谷歌搜索。显然,最简单的方法是直接在模块 build.gradle 中提供模块所需的所有依赖项。
  • @uselessdinosaur 可能还有更多。我已经尝试过传递依赖,但它似乎不起作用,但经过仔细检查并从下面的答案来看,这可能是一个 jitpack 特定问题

标签: android gradle android-gradle-plugin build.gradle jitpack


【解决方案1】:

我不再有权访问任何库依赖项。我只能使用我的库本身的代码和引用。

没错。

来自gradle docs

dependencies {
    api 'commons-httpclient:commons-httpclient:3.1'
    implementation 'org.apache.commons:commons-lang3:3.5' 
}

api 配置中出现的依赖项将是 传递给图书馆的消费者,因此将 出现在消费者的编译类路径中。

implementation 配置中找到的依赖项将在 另一方面,不会暴露给消费者,因此不会泄漏到 消费者的编译类路径。这有几个好处:

  • 依赖不再泄漏到消费者的编译类路径中,因此您永远不会意外依赖传递 依赖
  • 由于类路径大小减小,编译速度更快
  • 实现依赖关系发生变化时减少重新编译:消费者不需要重新编译
  • 更清洁的发布:与新的 maven-publish 插件结合使用时,Java 库会生成 POM 文件, 准确区分编译所需的内容 库以及在运行时使用该库需要什么(在其他 话,不要混合编译库本身需要什么和什么 需要针对库进行编译)。

【讨论】:

  • 这最终成为 dcendants maven 插件的问题。使用 api 来测试它是否可以工作,它的行为应该与旧的编译选项完全一样。
【解决方案2】:

问题似乎与 android-maven-gradle-plugin 有关

ssue Report

【讨论】:

  • 已在“2.0”版本中修复
【解决方案3】:

它已在android-maven-gradle-plugin的“2.0”版本中修复

更新到

dependencies {
        classpath 'com.github.dcendents:android-maven-gradle-plugin:2.0'
}

或使用 Gradle 2.1 以来的新语法

plugins {
  id "com.github.dcendents.android-maven" version "2.0"
}


在您的库模块中使用api 允许您在您的库代码中访问临时依赖项;而不是使用它的应用程序。

所以要达到预期的效果,您需要在示例模块中进行更改。

implementation project(':core')

api project(':core')

注意您不需要在库中使用api,最好使用implementation,因为它可以加快您的构建速度。

【讨论】:

  • 它实际上适用于示例应用程序,但不适用于从 jitpack 提取的其他应用程序。此外,为什么示例模型应该使用api 而不是implementation?它不需要将另一个接口传递给另一个包。我正在考虑将项目依赖项转移到实现中,但这意味着那些想要选择一个特定项目的人需要自己添加其他依赖项。但无论如何,由于api 不起作用,我还没有到那个阶段。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-04-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多