The docs提到implementation
比compile
/ api
提供了显着的构建时间改进。那么compileOnly
呢?
我的用例是一个多模块(抱歉,我不喜欢Gradle的多项目术语)项目,我有一个Android应用程序,以及该应用程序所依赖的多个库(implementation
)。一些图书馆也相互依赖。在声明库模块中的依赖项时,我应该使用implementation
还是compileOnly
?我的app模块将使用implementation
来依赖这些工件,因此我不需要它们通过库模块传递。
答案 0 :(得分:20)
api
配置应该用于导出到外部modules
(传递依赖性)的依赖项。副Versa implementation
配置应该用于组件内部的依赖关系(不是传递依赖)。
实施与compileOnly :
他们的工作没有相似之处,compileOnly
是
因此compileOnly
不会替换implementation
配置作业,例如:
implementation 'com.android.support:appcompat-v7:25.1.0' // can't use compileOnly here
testCompile 'junit:junit:4.12'
compile "com.google.dagger:dagger:2.8" // can't use here also
annotationProcessor "com.google.dagger:dagger-compiler:2.8" // can't use here also
compileOnly 'javax.annotation:jsr250-api:1.0' // we can use compileOnly here because it's required on run time only.
由于您的案例是"多模块",您必须使用api
配置,在您到达最终模块之前,最好使用implementation
下图描述了这些配置:
<强>性能吗
我认为api
需要更多内存,因为 gradle 会对传递 模块中的每个类进行快照,反之亦然{{1是一个首选配置,因为(如上所述)它用于自己的内部实现。
答案 1 :(得分:6)
在Android Gradle插件3.0中,现已弃用compile
关键字,而推荐使用implementation
和api
。
api
:您通过自己的接口泄漏了此模块的接口,其含义与旧的compile
依赖项完全相同
implementation
:您仅在内部使用此模块,不会通过界面泄漏它
compileOnly
依赖项的功能类似于provided
,从而允许您声明仅在编译时使用的非传递性依赖项。
仅编译依赖性解决了许多用例,包括:
仅编译依赖性与常规编译依赖性明显不同。它们不包含在运行时类路径中,并且是非传递性的,这意味着它们不包含在相关项目中。
在此处了解更多-https://blog.gradle.org/introducing-compile-only-dependencies