Gradle DSL
Table of Contents
1. Gradle DSL
build.gradle 是一个用 groovy 实现的 DSL, 其中所有的关键字都通过 groovy closure 的 delegate 机制交给相应的类来处理
1.1. Project
整个 build.gradle 做为一个 closure 通过 delegate 交给 Project 对象处理. Project 支持的方法和 property 即是 build.gradle 在顶级支持的关键字. gradle 执行 build.gradle 时类似于下面的代码:
project=new Project(); script=build.gradle script.delegate=project script.call()
1.1.1. task
Project.task(String name) Project.task(String name, Closure configureClosure)
delegate to Task:
- group
- dependsOn
- doFirst
- doLast
- …
task hello {
// Task 同时有 group 属性和 group 方法
group "test"
group="test"
// Task 同时有 dependsOn 属性和 dependsOn 方法, 但 dependsOn 属性是 Iteratable
// 可以直接 dependsOn="world" 会报错
dependsOn "world"
doLast {
// 打印 Task 的各种属性, 也是通过 delegate
println dependsOn
println group
println path
}
}
task world {
group "test"
doLast {
println dependsOn
println group
println path
}
}
1.1.2. buildscript
1.1.3. defaultTasks
// Project 类中既有 defaultTasks 属性, 也有 defaultTasks 方法
// class Project {
// List<String> defaultTasks
// void defaultTasks(List<String> tasks) {}
// }
defaultTasks(["hello","world"])
// or
defaultTasks "world","hello"
println (defaultTasks)
1.1.4. dependencies
delegate to DependencyHandler:
1.1.5. apply & plugins
apply 和 plugins 都可以导致其它 plugin, plugin 可以增加给 Project 新的函数, 或者 task 等
plugins {
// core plugin, 使用简称, 不带版本号
// id "core.gradle.java"
id "java"
// community plugin, 需要完整名称和版本号
id "com.sunway.test" version "1.0"
}
apply plugin:"com.sunway.test2" version:"1.0"
1.2. Plugin
gradle plugin 可以导入新的 task 和函数.
例如使用 "java" plugin 后,
- 新的 task:
- assemble, build, clean, …
- check, test
- 新的函数和属性
- dependencies, sourceSets
1.2.1. Sample Plugin
class GreetingPluginExtension {
String message = 'haha'
}
class GreetingPlugin implements Plugin<Project> {
void apply(Project project) {
def extension = project.extensions.create('greeting', GreetingPluginExtension)
project.task('greeting') {
group "test"
doLast {
println 'Hello from the GreetingPlugin:'+extension.message
}
}
}
}
plugins {
id "java"
id "application"
}
apply plugin: GreetingPlugin
greeting {
message="hi"
}
1.3. Java Plugin
1.3.1. task
1.3.2. project
- sourceSets
1.3.3. dependencies
- implementation
- compileOnly
- annotationProcessor
- …
