Gradle 使用一种基于 Groovy(或 Kotlin)的领域特定语言(DSL)来编写构建脚本。以下是 Gradle 语法的一些关键特性及示例:
1. 构建脚本文件结构
Gradle 的构建脚本通常位于项目根目录下的 build.gradle
(或 build.gradle.kts
如果使用 Kotlin DSL)文件中。对于多项目构建,每个子项目可以有自己的 build.gradle
文件,而在根目录下有一个总的 settings.gradle
(或 settings.gradle.kts
)文件来定义项目结构。
2. 基本构建块: 项目(Project)与任务(Task)
- 项目:Gradle 以项目作为组织构建的基本单位。每个项目由一个
project
对象表示,包含一组任务、依赖、配置等信息。
groovy
// build.gradle
apply plugin: 'java' // 应用 Java 插件
group = 'com.example'
version = '1.0.0'
repositories {
mavenCentral() // 添加依赖仓库
}
dependencies {
implementation 'org.springframework:spring-core:5.3.22' // 添加依赖
}
- 任务:任务是构建过程中的原子操作,如编译、测试、打包等。每个任务由一个
Task
对象表示,可以定义动作、依赖关系和属性。
groovy
task helloWorld << {
println 'Hello, World!'
}
task copyFiles(type: Copy) { // 使用 Copy 类型的任务
from 'src/main/resources'
into 'build/resources'
include '**/*.txt'
}
3. 依赖管理
Gradle 通过 dependencies
块来管理项目依赖。依赖可以分为以下几种类型:
- implementation:编译与运行时依赖,仅对当前模块内部可见,不会传递到依赖此模块的其他模块。
- api:与
implementation
类似,但会将依赖接口暴露给依赖此模块的其他模块。 - compileOnly:仅用于编译期,不包含在运行时依赖中。
- runtimeOnly:仅用于运行时,不参与编译。
- testImplementation / testRuntimeOnly:仅用于测试编译与运行时。
groovy
dependencies {
implementation 'com.google.guava:guava:31.1-jre'
api 'org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.7.½'
compileOnly 'javax.servlet:javax.servlet-api:4.0.1'
runtimeOnly 'mysql:mysql-connector-java:8.0.30'
testImplementation 'junit:junit:4.13.2'
}
4. 插件(Plugin)
插件为 Gradle 提供了特定领域的构建功能。通过 apply plugin:
语句应用插件,插件可以添加新的任务、扩展项目属性、引入默认依赖等。
groovy
apply plugin: 'java' // Java 插件
apply plugin: 'maven-publish' // Maven 发布插件
apply plugin: 'com.github.johnrengelman.shadow' // Shadow 插件用于生成 fat JAR
publishing {
publications {
maven(MavenPublication) {
from components.java
}
}
}
5. 脚本逻辑与控制流
由于 Gradle 脚本使用 Groovy 或 Kotlin 编写,可以直接利用这些语言的控制流特性:
groovy
if (project.hasProperty('debugMode')) {
println 'Building in debug mode'
}
tasks.withType(Test) {
systemProperties 'env': 'test'
maxParallelForks = 2
}
def versions = ['1.¼', '1.5', '2.0']
versions.each { version ->
task("generateDocsFor$v") {
doLast {
println "Generating docs for version $version"
}
}
}
6. 构建变体(Variant)与多项目构建
Gradle 支持构建变体来处理不同构建场景的需求,如不同构建类型(debug/release)、不同构建 flavor(免费版/付费版)等。对于多项目构建,通过 settings.gradle
定义项目结构,并在各个项目间声明依赖关系。
groovy
// settings.gradle
include 'app', 'library'
project(':app').dependsOn ':library'
7. 自定义任务与类型
除了使用现有任务类型,Gradle 还支持自定义任务类和扩展已有类型。
groovy
class MyCustomTask extends DefaultTask {
@InputFile
File inputFile
@OutputFile
File outputFile
@TaskAction
void generate() {
// 实现任务逻辑
}
}
task customTask(type: MyCustomTask) {
inputFile = file('input.txt')
outputFile = file('output.txt')
}
8. 构建缓存与增量构建
Gradle 提供了高效的缓存机制和增量构建能力,可以避免重复工作,加快构建速度。
groovy
// 启用缓存
tasks.withType(AbstractCompile).each { it.options.incremental = true }
// 清除缓存
gradle.buildCache.clean()
9. 命令行交互
Gradle 提供丰富的命令行选项,如 --info
、--stacktrace
、--dry-run
等,用于控制构建过程的输出和行为。
sh
./gradlew build --info
./gradlew clean test --rerun-tasks
以上是 Gradle 语法的一些基本要点。实际使用时,应结合官方文档和具体项目需求来深入理解和应用 Gradle 的各种特性。