什么是Kotlin Gradle依赖项中的“实现”?

时间:2017-06-09 08:46:34

标签: android gradle android-gradle kotlin

我正在使用Android Studio 3.0 Preview来启动新的Kotlin项目。当我尝试在build.gradle中添加依赖项时,我看到了implementation范围,而不是通常的compile

androidTestImplementation('com.android.support.test.espresso:espresso-core:2.2.2', {
    exclude group: 'com.android.support', module: 'support-annotations'
})
implementation 'com.android.support:appcompat-v7:25.3.1'
testImplementation 'junit:junit:4.12'

还有androidTestImplementationtestImplementation范围。

最后,我添加了compile来添加第三方依赖项,它可以正常运行。

compile 'io.reactivex.rxjava2:rxandroid:2.0.1'

所以我的问题是......

  • 什么是implementationandroidTestImplementationtestImplementation范围?
  • compiletestCompileandroidTestCompile有什么不同?
  • 我应该在Kotlin项目中使用哪一个?

编辑: 我的不好,这个问题不是Kotlin具体的。这是新的Android Gradle Plugin configuration

2 个答案:

答案 0 :(得分:20)

这不是特定于Kotlin,而是与Android的新Gradle插件有关。

compileprovidedapk现已弃用 使用implementationapi代替compilecompileOnly代替providedruntimeOnly代替apk

这样做的原因是为了加速多模块构建。给定模块A取决于模块B,模块C又取决于模块C,模块A中的更改将触发模块A的重新编译。如果C未直接使用A,则C更改后implementation无需重新编译。

implementation project(':C')配置确保了这一点:如果您在B中指定C,则无法从A访问A = rand(3) ; B = rand(1,3) ; C = bsxfun(@plus, A, B); % is same as C1 = repmat(B,3,1) ; ,并且您无法构建不必要的模块。在大型多模块项目中,这可以节省大量时间。

有关详细信息,请参阅Migrate to the new Gradle plugin

答案 1 :(得分:1)

早期版本的gradle v3.0.0-alpha1曾使用compile,但现在已弃用。

为什么?

compile配置中出现的依赖关系将传递给库的使用者,因此将出现在使用者的编译类路径中。另一方面,实现配置中的依赖关系不会暴露给消费者,因此不会泄漏到消费者的编译类路径中。

让我们举一个例子来理解这一点。比方说,我创建了一个支持Library_Image_Upload的{​​{1}}到服务器。我在Image uploading中使用Library_Network lib来支持所有网络操作。我的图书馆只使用图片上传,并提供上传图片的便捷方式。现在,当我在Library_Image_Upload项目中使用Library_Network lib时,使用此lib的每个人都将具有Library_Image_Upload的功能以及所有网络操作,有人也可以使用重要)。后来我认为Image UploadingLibrary_Network作为Library_Magic_Image的更好替代方案并使用它。因此,Library_Network公开的所有API函数都已消失,使用这些函数的任何人都破坏了构建

implementation带来了好处:

  • 依赖关系不再泄漏到消费者的编译类路径中,因此您永远不会意外地依赖于传递依赖
  • 由于减少了类路径大小,编译速度更快
  • 当实现依赖关系发生变化时,重新编译的次数减少:消费者不需要重新编译
  • 清理发布:当与新的maven-publish插件结合使用时,Java库会生成POM文件,这些文件准确区分编译库所需的内容和在运行时使用库所需的内容(换句话说,不要混合编译库本身所需的内容和编译库所需的内容。

要了解详情,请阅读The Java Library Plugin

所以我认为你有三个问题的答案。

我希望它有所帮助。