gradle 闭包中可用的方法

laa*_*haa 1 groovy gradle

我们如何知道 Gradle 闭包中有哪些可用方法?例如:

task greeting {
    dependsOn greeting0

    doLast {
        println("hi")
    }
}

Run Code Online (Sandbox Code Playgroud)

在上面传递给任务的闭包中greeting,Gradle 特定的dependsOn&doLast来自哪里?

dependsOn都是doLast方法Task。然而,如果我们看一下项目文档,就会发现闭包只是一个简单的 Groovy Closure

tim*_*tes 5

作为示例,这里有一个 Groovy DSL 脚本,它显示了正在发生的情况(我希望如此)

class Example {

    def missingMethod(String name, args) {
        println name
    }
    
    static run(Closure cl) {
        def project = new Project()
        cl.delegate = project
        cl.resolveStrategy = Closure.DELEGATE_FIRST
        cl.call()
    }
}

class Project {

    def task(taskDefinition) {
        def task = new Task()
        taskDefinition[0].delegate = task
        taskDefinition[0].resolveStrategy = Closure.DELEGATE_FIRST
        taskDefinition[0].call()
    }

    def and(String what) {
        println "Project $what"
    }
    
    def methodMissing(String name, args) {
        args
    }
}

class Task {

    def say(String what) {
        println "Task $what"
    }
}

// So now we can "run" a script
Example.run {

    task woo {
        say "hello" // From task
        and "world" // From project
    }
}
Run Code Online (Sandbox Code Playgroud)

这打印

Task hello
Project world
Run Code Online (Sandbox Code Playgroud)