gradle语法的实现:属性,后跟配置关闭

时间:2018-12-30 18:09:01

标签: gradle groovy

我对下面的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。评估顺序令我感到困惑。我可以想到两种可能性:

  1. 代码等同于task(hello(closure))
  2. 代码等同于task(hello)(closure)

对于1,这似乎不是gradle方式。但是,我在this doc之后进行了DSL快速实验。看来这是运行DSL脚本时发生的情况。

对于2,这似乎是gradle方式,因为我在gradle源代码中看到了this code。此代码是两步操作。首先,task(hello)创建一个新任务。其次,新任务由闭包配置。像someTask(closure)这样的代码似乎可以转换为someTask.configure(closure)。但是,我不确定。

无论如何,对上述语法示例以及gradle如何实现它们的任何解释都非常受欢迎。

0 个答案:

没有答案