我有一个具有以下结构的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'
,则所有依赖项(在通用build.gradle中实现)也可以在应用程序模块中使用。但是如果我像下面那样使用它implementation project(:Commons:common)
,仅可使用通过api
提供的依赖项。我想知道
api
和implementation
相对于模块是否像上面那样直接编译或使用有什么区别? 最佳答案
这里有两件事在起作用:
api
和implementation
的分隔。简而言之,implementation
范围中的依赖项仅在运行时可见,因为它们是实现细节。此类库将在其已发布的Maven元数据中使用runtime
范围。 the documentation compile
和runtime
,因此所有runtime
依赖项确实出现在编译类路径上。 Gradle 5 changes this 因此,当您发布组件时,Gradle 4.x的局限性意味着
common
可以使用app
依赖项。请注意,移至Gradle 5处将导致破裂,如记录所示。而且,当您直接使用项目时,可以正确执行分隔。
解决方法是简单地将依赖于通用api的一部分的依赖关系提升为
api
中的common
配置,对于运行时的依赖关系,在app
中声明它们,因为毕竟它们直接需要它们。关于gradle - 依赖项目中缺少依赖,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/54145395/