4

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

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

有没有办法解决?

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

依赖项:

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 中提取。将此 gradle视为不会构建的示例。我尝试过使用 api、实现、@aar 和传递的组合。

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

4

3 回答 3

1

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

它是正确的。

gradle 文档

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

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

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

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

于 2017-08-19T18:50:25.017 回答
0

It's has been fixed in version "2.0" of android-maven-gradle-plugin

just update to

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

or using the new syntax since Gradle 2.1

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


using api in your library module allows you to access the transient dependencies only in your library code; not the apps that consume it.

so to achieve the desired effect you need to change in your sample module.

implementation project(':core')

to

api project(':core')

note you don't need to use api in your library it's better to use implementation as it speeds up your build.

于 2017-08-01T20:56:43.543 回答
0

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

发出报告

于 2017-08-19T18:40:15.560 回答