2012-09-07 26 views
29

我在学习Gradle。我喜欢的学习方式是在低层次上理解正在发生的事情。为此,我试图解释发生的事情在文档的example 6.1关于DSL reference:如何解释Gradle DSL

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

据我所知,这个脚本是在一个Project的上下文中执行。因此,我可以从Projectdocumentation看到,有许多重载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)形式的方法。但是,

  1. 再次,文字字符串taskX如何以String结尾?
  2. 由于括号不用于构建Map文字,如何在括号中的部分最终会被Map
  3. 如果我正确地计算出被称为哪一种方法,都没有比DSL文档中的脚本错误的顺序给出的参数?
  4. 使用括号内的语法看起来所有的世界就像一个方法调用。这可能表示对Project对象的授权将解决taskX作为未知方法。但是,AFAIK,考虑到方法调用前面的task,方法调用在此时不会在语法上有效。

正如你可以看到我有点困惑,实例语法下来怎么映射到DSL参考指南,这使得它有点棘手,我真正了解发生了什么事在基层。

谢谢!

+1

我和你有同样的困惑。我真的希望Gradleware能提供一些解释。 – peacepassion

+0

这个问题可能是更详细的。 [gradle任务定义中的常规语法](http://stackoverflow.com/questions/27584463/understanding-the-groovy-syntax-in-a-gradle-task-definition/27584555#27584555) – user3875388

+0

可能的重复[Understanding在gradle这个任务定义的常规语法(https://stackoverflow.com/questions/27584463/understanding-the-groovy-syntax-in-a-gradle-task-definition) – tkruse

回答

17

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

+4

有趣。我对Groovy比较陌生,而且我不喜欢的一件事是,当人们完成像这样“聪明”的事情时,弄清楚发生了什么事情是多么困难 - 通常是为了使他们的DSL易于使用/写入。关于如何在脚本和DSL参考指南之间进行翻译(在我的脑海中),您有任何具体的建议吗? – dty

+0

语法记录在用户指南和DSL参考中;注意他们如何谈论任务*关键字*。回想起来,它可能有点超过顶端,虽然它比非魔术替代品读得更好。正如我所说,这是一个罕见的例外。考虑到你如何分析这里一定存在“错误”,你很快就会理解Gradle DSL覆盖下发生的所有其他事情。 –

+0

谢谢彼得。最后一个问题,如果我可以的话。你能指点我在Gradle源代码中的正确位置来查看这个编译器插件吗? – dty

相关问题