相关疑难解决方法(0)

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

我是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代码?

groovy gradle

73
推荐指数
1
解决办法
5882
查看次数

如何解读Gradle DSL

我正在努力学习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)方法的形式.但,

  1. 再一次,文字字符串如何taskX最终成为String
  2. 鉴于括号不用于构造Map文字,括号中的部分如何最终成为Map
  3. 如果我已经正确地找出了调用哪个方法,那么与DSL文档相比,脚本中错误顺序的参数是不是?
  4. 使用括号的语法像方法调用一样查找全世界.这可能表示委托给Project对象解析taskX为未知方法.但是,AFAIK,方法调用在这一点上在语法上不会有效,因为方法调用task紧接在它之前.

正如您所看到的,我对示例语法如何映射到DSL参考指南感到有点困惑,这让我真的很难理解基层正在发生的事情. …

gradle

31
推荐指数
1
解决办法
2132
查看次数

标签 统计

gradle ×2

groovy ×1