我正在尝试学习Gradle。我偏爱的学习方式是从低层次了解发生了什么。为此,我试图解释有关example 6.1的文档DSL reference:中发生的情况

task hello {
    doLast {
        println 'Hello world!'
    }
}

我了解此脚本是在Project的上下文中执行的。因此,从Project documentation可以看到,有许多重载的task(...)方法。查看签名,我需要选择一个带有闭包的签名作为最终论点。并且由于我们没有在此处传递Map,因此我假设要调用的方法是task(String name, Closure closure)

但是,我正在努力的部分是在此脚本中如何将文字字符串hello映射到String

另一个示例是example 6.7:
task taskX(dependsOn: 'taskY') << {
    println 'taskX'
}

task taskY << {
    println 'taskY'
}

在这里,我假设我们正在调用该方法的task(Map<String, ?> args, String name)形式。但,
  • 同样,文字字符串taskX如何最终变成String
  • 鉴于不使用括号来构造Map文字,括号中的部分最终如何成为Map
  • 如果我正确确定了正在调用的方法,那么与DSL文档相比,脚本中给出的参数难道不是错误的顺序吗?
  • 使用括号的语法看起来像方法调用一样。这可能表明委托(delegate)给Project对象来将taskX解析为未知方法。但是,对于AFAIK,如果给定紧接在其前面的task的方法调用,则该方法调用此时在语法上将无效。

  • 如您所见,我对示例语法如何映射到DSL引用指南感到有些困惑,这让我很难真正了解基层的情况。

    谢谢!

    最佳答案

    任务声明语法的task foo变体的特殊之处在于,它是使用Groovy编译器插件实现的。据我所知,这是唯一使用编译器插件支持特殊语法的情况。

    08-24 12:33
    查看更多