Gradle
Gradle是一个基于Apache Ant和Apache Maven概念的项目自动化建构工具。Gradle 构建脚本使用的是 Groovy 或 Kotlin 的特定领域语言来编写的[2],而不是传统的XML。[3]
原作者 | Hans Dockter |
---|---|
开发者 | Gradle developers |
当前版本 | 7.3.3(2021年12月22日[1]) |
预览版本 | 7.0.0-M3(2021年3月12日 | )
源代码库 | |
编程语言 | Java、Groovy、Kotlin |
操作系统 | 跨平台 |
类型 | 自动化构建工具 |
许可协议 | Apache许可证 2.0 |
网站 | http://www.gradle.org/ |
当前官方支持的语言为Java、Groovy、Scala、C++、Swift、JavaScript等以及Spring框架[4]。
使用 Gradle 的优势
- 自动处理包相依关系 - 取自 Maven Repos 的概念
- 自动处理布署问题 - 取自 Ant 的概念
- 条件判断写法直觉 - 使用 Groovy 语言
过去 Java 开发者常用 Maven 和 Ant 等工具进行封装布署的自动化,或是两者兼用,不过这两个包彼此有优缺点,如果频繁改变相依包版本,使用 Ant 相当麻烦,如果琐碎工作很多,Maven 功能不足,而且两者都使用 XML 描述,相当不利于设计 if、switch 等判断式,即使写了可读性也不佳,而 Gradle 改良了过去 Maven、Ant 带给开发者的问题,至今也成为 Android Studio 内置的封装布署工具。
概念
插件
由于Gradle 的核心功能为真实世界提供了很少的自动化,其他实用性功能都是由插件提供[5][6],所以往往在使用了Gradle时候,往往都会使用插件以完整自动化操作。在特定的上下文语境下,Gradle 插件提供给用户对应合适的默认事项以及标准(惯例)。[7] 换言之,插件是对真实环境和上下文的一个补充和扩展。
使用插件分两步:解析插件、应用插件。[8]Gradle插件常见的两种关键词apply
和plugins
,前者仅仅是应用插件,后者是既分析又应用插件。[8]
依赖约束
依赖约束(Dependency constraint),用于帮助模块去获取一个可用的依赖。依赖约束,可以缩小模块的可支持版本的范围。而且这也能适用于传递依赖(transitive dependencies)。[9] 示例如下:
dependencies {
implementation 'org.apache.httpcomponents:httpclient'
constraints {
implementation('org.apache.httpcomponents:httpclient:4.5.3') {
because '之前的版本有bug,会影响到应用'
}
implementation('commons-codec:commons-codec:1.11') {
because ' 从httpclient获取的 1.9 版本有bug,会影响到应用'
}
}
}
插件
Java
Java Plugin
Java插件为项目提供了Java编译、测试以及其他一系列功能。同时Java插件是其他JVM语言插件的基础。官方文档不建议用户再直接使用Java插件,而应该使用基于Java插件的派生插件,如:java-library和application。[10] 在java插件中,compile
关键词(编译时依赖)已经废弃,取而代之是 implementation
关键词[11] ,而在java-library中可使用api
和implementation
关键词表示依赖。[12]
Java Application插件
Application插件,用于创建可执行的 JVM 应用。[10]
Java Library插件
Java依赖包插件用于提供Java依赖包的专门知识。 java-library插件增加了API的概念。implementation
和api
关键词区别在于:api
所依赖的依赖包,会作为该项目的API被暴露于调用者;implementation
所依赖的依赖包,不会作为该项目的API而暴露于调用者,调用者如果需要使用该依赖包需要另外声明。[12]
Java Platform插件
Java平台插件为Java生态系统提供平台的功能。平台可用于各种目的,如:[13]
- 各个子项目使用同一个版本号和描述,进行发布。
- 为用户提供一个推荐的版本的依赖包组合。
- 在不同的子项目中,共享依赖版本。
Ant迁移示例
Gradle与Ant有很紧密集成,甚至在构建时可以把Ant构建脚本直接导入。下面的例子展示了一个简单的Ant target被引入为一个Gradle task。
build.xml
<project>
<target name="ant.target">
<echo message="Running ant.target!"/>
</target>
</project>
build.gradle
ant.importBuild 'build.xml'
运行 gradle ant.target 将显示如下结果
> gradle ant.target
:ant.target
[ant:echo] Running ant.target!
BUILD SUCCESSFUL
参考文献
- ^ Gradle Distributions. Gradle Services. [2022-01-09]. (原始内容存档于2021-02-03).
- ^ Gradle User Manual. docs.gradle.org. [2020-02-21]. (原始内容存档于2021-02-03).
- ^ 存档副本. [2013-07-03]. (原始内容存档于2013-04-15).
- ^ Building Java Applications. guides.gradle.org. [2020-02-21]. (原始内容存档于2020-10-26).
- ^ Using Gradle Plugins. docs.gradle.org. [2020-02-21]. (原始内容存档于2020-11-23).
- ^ Gradle 插件 - Gradle 用户指南官方文档中文版 - UDN开源文档. doc.yonyoucloud.com. [2020-02-21]. (原始内容存档于2020-02-21).
- ^ Designing Gradle plugins. guides.gradle.org. [2020-02-21]. (原始内容存档于2020-10-26).
- ^ 8.0 8.1 Using Gradle Plugins. docs.gradle.org. [2020-02-23]. (原始内容存档于2020-11-23).
- ^ Dependency Management Terminology. docs.gradle.org. [2020-02-24]. (原始内容存档于2020-02-21).
- ^ 10.0 10.1 The Java Plugin. docs.gradle.org. [2020-02-21]. (原始内容存档于2021-02-03).
- ^ The Java Plugin. docs.gradle.org. [2020-02-21]. (原始内容存档于2021-02-03).
- ^ 12.0 12.1 The Java Library Plugin. docs.gradle.org. [2020-02-21]. (原始内容存档于2020-12-23).
- ^ The Java Platform Plugin. docs.gradle.org. [2020-02-23]. (原始内容存档于2020-10-28).