我有一个具有以下结构的android项目:
-- Calendar
------app (app module)
----------build.gradle (module level)
------build.gradle (project level)
------Commons(A common project which i reuse across various projects)
----------common (common module in Commons project)
-------------build.gradle (for only common module level)
----------build.gradle(for Commons Project)
现在的问题是,如果我编译 Commons,将其部署到 bintray,然后将其用作
implementation 'com.amitkma.Commons:common:1.0.0'
在 app 模块中,所有依赖项(在 common build.gradle 中实现)也可以在 app 模块中使用。但是如果我像下面这样使用它implementation project(:Commons:common)
, 仅使用 api
提供的依赖项可以使用。我想知道
api
和有什么区别和 implementation
关于模块是否像上面那样直接编译或使用?
最佳答案
这里有两件事在起作用:
api
的分离和 implementation
声明依赖项时。简而言之,implementation
中的依赖项范围仅在运行时可见,因为它们是实现细节。此类库将使用 runtime
范围在他们发布的 Maven 元数据中。更多信息请访问 the documentation compile
和 runtime
由 Gradle 混合,因此所有 runtime
依赖项确实出现在编译类路径中。 Gradle 5 changes this 所以当你发布你的组件时,Gradle 4.x 的限制意味着你的
common
app
可以使用依赖项.请注意,如文档所述,迁移到 Gradle 5 将导致那里的损坏。并且当您直接使用项目时,会正确执行分离。
解决方法是简单地将作为公共(public) api 一部分的依赖项提升到
api
common
中的配置对于运行时的,在 app
中声明它们毕竟它们是它直接需要的。
关于gradle - 依赖项目中缺少依赖项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54145395/