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
- …