为什么 Android 在 Gradle 依赖项中将 'compile' 更改为 'implementation' 配置?
Why Android change 'compile' to 'implementation' configuration in Gradle dependencies?
正如在 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
,但我想了解:
implementation
和 compile
配置有什么区别?
- 为什么 Android Gradle 构建更改为默认使用
implementation
?
似乎 compile
已被弃用,应该使用 api
或 implementation
代替。根据The Java Library Plugin - Gradle User Guide Version 3.5:
The compile
configuration still exists but should not be used as it will not offer the guarantees that the api
and implementation
configurations provide.
感谢@petter 非常有用的link,我想添加一个总结如下。
表示Android Gradle build
开始使用java-library
插件,而不是之前的java
插件。这个插件引入了 exposed API
概念,用两个 configuration
来声明依赖关系。
- api
should be used to declare dependencies which are exported by the
library API
例如,如果您正在构建一个供其他应用程序使用的 Java(或 Android)库。如果你使用任何第三方库并且你想将其 API 也暴露给你的库的消费者,你应该这样声明。
api 'commons-httpclient:commons-httpclient:3.1'
- 实施
should be used to declare dependencies which are internal to the
component.
在开发Android应用程序时,我们的app
模块是终点,不需要向外暴露任何部分。 implementation
应该被使用。
implementation 'org.apache.commons:commons-lang3:3.5'
之前的 compile
配置与 api
相同。然而,implementation
带来了以下好处。
- 依赖项不会泄漏到消费者的编译类路径中
不再,所以你永远不会意外地依赖于传递
依赖性
- 由于减小了类路径大小,编译速度更快
- 实现依赖项更改时减少重新编译:
消费者不需要重新编译
- cleaner publishing:与新版一起使用时
maven-publish 插件,Java 库生成
的 POM 文件
准确区分根据
编译所需的内容
库以及在运行时使用该库需要什么(在其他
话说,不要混淆编译库本身和
所需的东西
针对库进行编译需要什么)。
正如在 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
,但我想了解:
implementation
和compile
配置有什么区别?- 为什么 Android Gradle 构建更改为默认使用
implementation
?
似乎 compile
已被弃用,应该使用 api
或 implementation
代替。根据The Java Library Plugin - Gradle User Guide Version 3.5:
The
compile
configuration still exists but should not be used as it will not offer the guarantees that theapi
andimplementation
configurations provide.
感谢@petter 非常有用的link,我想添加一个总结如下。
表示Android Gradle build
开始使用java-library
插件,而不是之前的java
插件。这个插件引入了 exposed API
概念,用两个 configuration
来声明依赖关系。
- api
should be used to declare dependencies which are exported by the library API
例如,如果您正在构建一个供其他应用程序使用的 Java(或 Android)库。如果你使用任何第三方库并且你想将其 API 也暴露给你的库的消费者,你应该这样声明。
api 'commons-httpclient:commons-httpclient:3.1'
- 实施
should be used to declare dependencies which are internal to the component.
在开发Android应用程序时,我们的app
模块是终点,不需要向外暴露任何部分。 implementation
应该被使用。
implementation 'org.apache.commons:commons-lang3:3.5'
之前的 compile
配置与 api
相同。然而,implementation
带来了以下好处。
- 依赖项不会泄漏到消费者的编译类路径中 不再,所以你永远不会意外地依赖于传递 依赖性
- 由于减小了类路径大小,编译速度更快
- 实现依赖项更改时减少重新编译: 消费者不需要重新编译
- cleaner publishing:与新版一起使用时
maven-publish 插件,Java 库生成
的 POM 文件 准确区分根据
编译所需的内容 库以及在运行时使用该库需要什么(在其他 话说,不要混淆编译库本身和
所需的东西 针对库进行编译需要什么)。