Почему кавычки могут быть опущены в названиях заданий
Я не понимаю, почему нам не нужно добавлять кавычки к имени задачи 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
вытащить
Но ответ Дэвида правильный, это только для примера.
Скрипт сборки 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()