Почему кавычки могут быть опущены в названиях заданий

Я не понимаю, почему нам не нужно добавлять кавычки к имени задачи gradle, когда мы объявляем это следующим образом:

task hello (type : DefaultTask) {
}

Я попробовал в отличном проекте и нашел, что это незаконно, как gradle заставляет это работать. И я не понимаю выражения выше, почему мы можем добавить (type : DefaultTask)Как мы можем проанализировать это с отличной грамматикой?

2 ответа

Решение

В качестве примера в запускаемой форме 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 вытащить

Но ответ Дэвида правильный, это только для примера.

Смотрите также здесь в документации для Groovy

Скрипт сборки Gradle - это приложение Groovy DSL. При тщательном использовании методов methodMissing и propertyMissing возможно все волшебство.

Я не помню точный механизм вокруг "задачи". Я думаю, что это было задано на форуме Gradle (вероятно, не раз).

Вот код, который делает волшебство возможным и законным.

// 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()
Другие вопросы по тегам