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

1.4. Android Plugin

Author: [email protected]
Date: 2019-08-02 Fri 00:00
Last updated: 2022-02-25 Fri 22:34

知识共享许可协议