首页 文章

了解gradle任务定义中的groovy语法

提问于
浏览
68

我是Gradle和Groovy的新手,并且在定义gradle任务时试图了解groovy级别的情况 .

task hello  { 
   println "configuring task hello" 
   doLast {
     println "hello there" 
   }
}

通过阅读"Gradle In Action"书,我知道 task hello {} 实际上是对groovy Project 接口的 task() 方法的调用 . 在页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)

我知道 {} 是封闭体 .

我不明白的是,根据https://stackoverflow.com/a/25592665/438319,groovy在 task hello { } 中如何解释 hello 有一个groovy编译器插件将 task hello { } 转换为 task('hello', { })

我的问题:

  • 在哪里可以找到有关进行转换的Gradle Groovy编译器插件的信息?

  • Gradle脚本在groovy程序中声称技术上是不正确的,因为gradle以某种方式扩展了Groovy编程语言?

  • 有没有办法让 gradle 命令打印出编译器插件运行后生成的基本groovy代码?

1 回答

  • 81

    Gradle使用AST Transformations来扩展Groovy语法 . 您提到的任务定义语法只是Gradle应用的转换之一 . 您可以找到该转换的实现here . 回答您的具体问题:

    • Gradle应用的单个变换没有具体记录在我所知道的任何地方 . 但是,您可以查看上面链接的同一个包中的其他类 .

    • Gradle脚本支持超级Groovy语法集 . 任何有效的Groovy在Gradle脚本中也是有效的,但是,Gradle脚本不一定(通常不是)有效的“默认”Groovy .

    • 没有办法获得等效的Groovy代码的输出,因为它是在内存中被操作的实际抽象语法树 .

相关问题