我有一个包含子模块的库项目,其中包含许多依赖项,我希望将这些依赖项传递给开发人员的应用程序。例如,模块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,implementation,@ aar和transitive的组合。
想想看,这可能是一个jitpack问题,而不是一个问题,但如果其他人有解决方案,我想听听它。
答案 0 :(得分: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
,因为它可以加快您的构建速度。
答案 1 :(得分:0)
这个问题似乎与android-maven-gradle-plugin
有关答案 2 :(得分:0)
我无法再访问任何库依赖项。我只能使用我自己库中的代码和引用。
这是对的。
来自gradle docs:
dependencies { api 'commons-httpclient:commons-httpclient:3.1' implementation 'org.apache.commons:commons-lang3:3.5' }
api
配置中出现的依赖关系将是 传递给图书馆的消费者,因此会 出现在消费者的编译类路径中。在
implementation
配置中找到的依赖关系 另一方面,不要暴露给消费者,因此不会泄漏 消费者的编译类路径。这有几个好处:
- 依赖关系不再泄漏到消费者的编译类路径中,因此您永远不会意外地依赖于传递 依赖
- 由于减少了类路径大小,编译速度更快
- 当实现依赖关系发生变化时,重新编译的次数减少:消费者不需要重新编译
- 清洁发布:当与新的maven-publish插件结合使用时,Java库会生成POM文件 准确区分编译所需的内容 库以及在运行时使用库所需的内容(在其他方面) 单词,不要混合编译库本身所需的东西和什么 需要针对库进行编译。)