我对下面的gradle语法感到困惑:
// style 1
test {
useTestNG()
}
其中test
是一个任务,也是build.gradle脚本的项目属性。上面的代码等效于
// style 2
test.useTestNG()
样式2是简单易懂的常规代码。样式1像使用the groovy with
method一样,只不过它没有.with
部分。通过向metaClass添加call(Closure)
方法,我设法获得了类似的东西。参见下面的代码。
def sb = new StringBuilder()
sb.metaClass.call = {action -> delegate.with action}
sb {
append('hello')
}
但是,我怀疑这是gradle的实现。
另一种更复杂的语法如下:
task hello {
doLast {println 'hello world'}
}
如果我们分解以上代码,其结构将类似于task hello closure
。评估顺序令我感到困惑。我可以想到两种可能性:
task(hello(closure))
task(hello)(closure)
对于1,这似乎不是gradle方式。但是,我在this doc之后进行了DSL快速实验。看来这是运行DSL脚本时发生的情况。
对于2,这似乎是gradle方式,因为我在gradle源代码中看到了this code。此代码是两步操作。首先,task(hello)
创建一个新任务。其次,新任务由闭包配置。像someTask(closure)
这样的代码似乎可以转换为someTask.configure(closure)
。但是,我不确定。
无论如何,对上述语法示例以及gradle如何实现它们的任何解释都非常受欢迎。