我是Gradle和Groovy的新手,并且在定义gradle任务时试图了解groovy级别的情况.
task hello {
println "configuring task hello"
doLast {
println "hello there"
}
}
Run Code Online (Sandbox Code Playgroud)
通过阅读"Gradle In Action"一书,我知道这task hello {}是task()对groovy Project界面方法的真正调用.在页77上,它显示在Project接口上有4个称为任务的方法
task(args: Map<String,?>, name:String)
task(args: Map<String,?>, name:String, c:Closure)
task(name: String)
task(name: String, c:Closure)
Run Code Online (Sandbox Code Playgroud)
我明白这{}是封闭体.
我不明白的是hello,task hello { }根据/sf/answers/1791486581/,groovy如何解释有一个groovy编译器插件转换task hello { }成task('hello', { })
我的问题:
在哪里可以找到有关转换的Gradle Groovy编译器插件的信息?
是否Gradle脚本是groovy程序在技术上是不正确的,因为gradle以某种方式扩展了Groovy编程语言?
有没有办法让gradle命令打印出编译器插件运行后生成的基本groovy代码?
我正在努力学习Gradle.我偏好的学习方式是从低层次了解正在发生的事情.为此,我试图解释有关DSL参考的文档的示例6.1中发生的情况:
task hello {
doLast {
println 'Hello world!'
}
}
Run Code Online (Sandbox Code Playgroud)
我知道这个脚本是在一个上下文中执行的Project.所以我可以从Project 文档中看到有很多重载task(...)方法.看一下签名,我需要选择一个有闭包作为最终参数的签名.因为我们没有在Map这里传递,所以我假设被调用的方法是task(String name, Closure closure).
但是,我正在努力的部分是,在这个脚本中,文字字符串如何hello映射到a String.
另一个例子是例6.7:
task taskX(dependsOn: 'taskY') << {
println 'taskX'
}
task taskY << {
println 'taskY'
}
Run Code Online (Sandbox Code Playgroud)
在这里,我假设我们正在调用task(Map<String, ?> args, String name)方法的形式.但,
taskX最终成为String?Map文字,括号中的部分如何最终成为Map?Project对象解析taskX为未知方法.但是,AFAIK,方法调用在这一点上在语法上不会有效,因为方法调用task紧接在它之前.正如您所看到的,我对示例语法如何映射到DSL参考指南感到有点困惑,这让我真的很难理解基层正在发生的事情. …