为什么可以在 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
但大卫的回答是正确的,这只是举例
这是使魔法成为可能且合法的代码。
// 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()
我不明白为什么我们在声明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
但大卫的回答是正确的,这只是举例
这是使魔法成为可能且合法的代码。
// 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()