【问题标题】:why can quotes be left out in names of gradle tasks为什么在 gradle 任务的名称中可以省略引号
【发布时间】:2016-10-06 19:33:53
【问题描述】:

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

task hello (type : DefaultTask) {
}

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

【问题讨论】:

标签: gradle groovy build-tools


【解决方案1】:

作为 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打印到标准输出

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

See also here in the documentation for Groovy

【讨论】:

    【解决方案2】:

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

    我不记得围绕“任务”的确切机制。我认为这是在 Gradle 论坛中提出的(可能不止一次)。

    【讨论】:

    【解决方案3】:

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

    // 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()
    

    【讨论】:

      猜你喜欢
      • 2015-03-15
      • 1970-01-01
      • 2013-01-31
      • 1970-01-01
      • 1970-01-01
      • 2011-01-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多