【问题标题】: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()