为什么可以在 gradle 个任务的名称中省略引号

why can quotes be left out in names of gradle tasks

我不明白为什么我们在声明gradle任务时不需要在名称中添加引号 喜欢:

task hello (type : DefaultTask) {
}

我在一个groovy项目中尝试过,发现它是非法的,gradle是如何让它工作的。 而且上面的表达式我也不明白,为什么可以加(type : DefaultTask),怎么用groovy语法分析呢?

Gradle 构建脚本是一个 Groovy DSL 应用程序。通过仔细使用 "methodMissing" 和 "propertyMissing" 方法,所有魔法都是可能的。

我不记得 "task " 周围的确切机制。我想这是在 Gradle 论坛中被问到的(可能不止一次)。

以 GroovyConsole 可运行形式为例,您可以这样定义一些代码:

// Set the base class for our DSL

@BaseScript(MyDSL)
import groovy.transform.BaseScript

// Something to deal with people
class Person { 
    String name
    Closure method
    String toString() { "$name" }
    Person(String name, Closure cl) {
        this.name = name
        this.method = cl
        this.method.delegate = this
    }
    def greet(String greeting) {
        println "$greeting $name"
    }
}

//  and our base DSL class

abstract class MyDSL extends Script {
    def methodMissing(String name, args) {
        return new Person(name, args[0])
    }

    def person(Person p) {
        p.method(p)
    }
}

// Then our actual script

person tim {
    greet 'Hello'
}

所以当底部的脚本被执行时,它打印 Hello tim 到 stdout

但大卫的回答是正确的,这只是举例

See also here in the documentation for Groovy

这是使魔法成为可能且合法的代码。

// DSL class - Gradle Task
class Task {

    def name;
}

// DSL class - Gradle Project
class Project {

    List<Task> tasks = [];


    def methodMissing(String name, def args) {
        if(name == "task"){
            Task t = new Task(name:args[0])
            tasks << t
        }
    }

    def propertyMissing(String name) {
        name
    }
}

// gradle build script
def buildScript = {

    task myTask

    println tasks[0].name

}

buildScript.delegate = new Project()

// calling the script will print out "myTask"

buildScript()