【问题标题】:How to interpret Gradle DSL如何解释 Gradle DSL
【发布时间】:2012-09-01 19:39:14
【问题描述】:

我正在尝试学习 Gradle。我喜欢的学习方式是在低层次上了解正在发生的事情。为此,我试图解释文档的example 6.1 中与DSL reference: 相关的内容。

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&lt;String, ?&gt; args, String name) 形式。但是,

  1. 同样,文字字符串taskX 是如何以String 结尾的?
  2. 鉴于括号不用于构造 Map 文字,括号中的部分如何最终成为 Map
  3. 如果我正确地确定了正在调用的方法,那么与 DSL 文档相比,脚本中给出的参数顺序是否错误?
  4. 使用括号的语法查找整个世界就像一个方法调用。这可能表示委托Project 对象以将taskX 解析为未知方法。但是,AFAIK,此时方法调用在语法上无效,因为方法调用紧接在其前面的 task

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

谢谢!

【问题讨论】:

标签: gradle


【解决方案1】:

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

【讨论】:

  • 有趣。我对 Groovy 比较陌生,我不喜欢的一件事是当人们做了这样的“聪明”事情时很难弄清楚发生了什么——通常是为了让他们的 DSL 易于使用/编写。对于我如何(在我的脑海中)在脚本和 DSL 参考指南之间进行翻译,你有什么具体的建议吗?
  • 语法在用户指南和 DSL 参考中都有记录;注意他们如何谈论任务关键字。回想起来,它可能有点过头了,尽管它确实比非魔法替代品读起来更好。正如我所说,这是一个罕见的例外。鉴于您如何分析这里一定存在“错误”,您正在理解 Gradle 的 DSL 范围内发生的所有其他事情。
  • 谢谢彼得。最后一个问题,如果可以的话。请您指出我在 Gradle 源代码中的正确位置以查看此编译器插件的运行情况吗?
  • gradle/subprojects/core/src/main/groovy/org/gradle/groovy/scripts/internal/TaskDefinitionScriptTransformer.java
【解决方案2】:

这是一个很好的文档: https://ouyi.github.io/post/2017/12/09/groovy-gradle.html

这里写在最后:

"自定义任务的语法比较复杂。例如:

task myTask(type:Tar, dependsOn anotherTask) {
    // clousre
}

我知道这可能是在调用项目对象上定义的方法Task task(Map&lt;String,?&gt; args, String name, Closure configureClosure),但我不知道如何将myTask() 构造与name 参数相匹配。而且我并不孤单,类似的讨论在这里和这里。

事实证明,Gradle 使用 Groovy 的一些高级元编程特性(编译时元编程)将 myTask() 构造转换为 name 参数。老实说,这是我不喜欢 Gradle 的部分,因为实现那些语法糖似乎太棘手了(而且过多的糖可能不健康)。毕竟,Gradle 只是一个构建工具,应该易于理解、使用和扩展。”

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-06-25
    • 1970-01-01
    • 1970-01-01
    • 2019-09-15
    • 1970-01-01
    • 2017-07-25
    • 2019-04-06
    相关资源
    最近更新 更多