【问题标题】:Why Android change 'compile' to 'implementation' configuration in Gradle dependencies?为什么 Android 将 Gradle 依赖项中的“编译”配置更改为“实现”配置?
【发布时间】:2017-06-07 01:19:51
【问题描述】:

正如在 Android Studio 3.0 (canary 3.0) 中所见,我们现在通过声明 implementation 而不是 compile 配置来添加 depedencies

// Before
compile 'com.android.support:appcompat-v7:25.3.1'

// Currently
implementation 'com.android.support:appcompat-v7:25.3.1'

我们仍然可以使用compile,但我想了解:

  • implementationcompile 配置有什么区别?
  • 为什么 Android Gradle 构建更改为默认使用 implementation

【问题讨论】:

    标签: android gradle android-gradle-plugin android-studio-3.0


    【解决方案1】:

    感谢@petter 提供的非常有用的链接,我想添加如下摘要。

    这意味着Android Gradle build 开始使用java-library 插件,而不是之前的java 插件。这个插件引入了exposed API的概念,用两个configuration来声明依赖。

    1. api

    应该用于声明由 库 API

    例如,如果您正在构建一个供其他应用使用的 Java(或 Android)库。如果您使用任何第三方库,并且还想将其 API 公开给您的库的使用者,您应该这样声明。

    api 'commons-httpclient:commons-httpclient:3.1'
    
    1. 实施

    应该用于声明内部依赖 组件。

    在开发Android应用时,我们的app模块是终点,不需要对外暴露任何部分。应该使用implementation

    implementation 'org.apache.commons:commons-lang3:3.5'
    

    之前的compile 配置与api 的工作方式相同。但是,implementation 带来了以下好处。

    • 依赖项不会泄漏到消费者的编译类路径中 不再,所以你永远不会意外地依赖传递 依赖
    • 由于类路径大小减小,编译速度更快
    • 当实现依赖改变时重新编译更少: 消费者不需要重新编译
    • 更清洁的发布:与新的结合使用时 maven-publish 插件,Java 库生成 POM 文件
      准确区分编译所需的内容
      库以及在运行时使用该库需要什么(在其他 换句话说,不要混合编译库本身所需的内容和
      针对库进行编译需要什么)。

    【讨论】:

    • 这很清晰易懂,感谢您分享您的知识。
    • As - 依赖不再泄漏到消费者的编译类路径中,因此您永远不会意外依赖传递依赖@Quang - What if I am developing a library for Android applications where I want to ship this with few dependencies I have used inside the library?
    【解决方案2】:

    似乎compile 已被弃用,而应使用apiimplementation。根据The Java Library Plugin - Gradle User Guide Version 3.5

    compile 配置仍然存在,但不应使用,因为它无法提供 apiimplementation 配置提供的保证。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-07
      • 1970-01-01
      相关资源
      最近更新 更多