33

文档提到implementation提供了显着的构建时间改进compile/ api。怎么样compileOnly

我的用例是一个多模块(对不起,我不喜欢 Gradle 的多项目术语)项目,其中我有一个 Android 应用程序,以及该应用程序依赖的多个库(implementation)。一些库还相互依赖。我应该使用implementation还是compileOnly在库模块中声明依赖项时?我的应用程序模块将implementation用于依赖这些工件,因此我不需要它们通过库模块传递。

4

1 回答 1

30

api配置应用于导出到外部的依赖项modules (传递依赖项)。Vice-Versaimplementation配置应该用于组件内部的依赖项(不是传递依赖项)

实现与compileOnly

他们的工作没有相似之处,compileOnly

  • 从 java-plugin 继承的配置
  • 编译时需要
  • 也不包含在运行时类路径中或暴露给依赖项目。

所以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将快照该传递 模块中的每个类,反之亦然implementation是首选配置,因为(如上所述)它用于自己的内部实现。

于 2017-10-17T09:04:40.323 回答