为了账号安全,请及时绑定邮箱和手机立即绑定

了解Gradle任务定义中的常规语法

了解Gradle任务定义中的常规语法

我是Gradle和Groovy的新手,并试图了解在定义gradle任务时在Groovy级别上正在发生的事情。task hello  {    println "configuring task hello"    doLast {     println "hello there"    }}通过阅读“ Gradle In Action”这本书,我知道task hello {}确实是task()对Groovy Project接口方法的调用。在第77页上,它显示了Project接口上有4个称为task的方法task(args: Map<String,?>, name:String)task(args: Map<String,?>, name:String, c:Closure)task(name: String)task(name: String, c:Closure)我了解{}就是封闭体。我不明白的是groovy如何根据https://stackoverflow.com/a/25592665/438319解释hello,其中有一个groovy编译器插件可以转换为task hello { }task hello { }task('hello', { })我的问题:在哪里可以找到有关进行转换的Gradle Groovy Compiler插件的信息?因为gradle以某种方式扩展了Groovy编程语言,所以声称Gradle脚本是groovy程序在技术上是不正确的吗?有没有办法让gradle命令打印出编译器插件运行后生成的基本groovy代码?
查看完整描述

2 回答

?
忽然笑

TA贡献1806条经验 获得超5个赞

Gradle使用AST Transformations扩展了Groovy语法。您提到的任务定义语法只是Gradle应用的转换之一。您可以在此处找到该转换的实现。要回答您的特定问题:

  • 在我所知的任何地方,Gradle所应用的单个转换都没有专门记录。但是,您可以在上面的链接的同一包中查看其他类。

  • Gradle脚本支持Groovy语法的超集。任何有效的Groovy在Gradle脚本中也有效,但是,Gradle脚本不一定(而且通常不是)有效的“默认” Groovy。

  • 由于它是在内存中进行操作的实际抽象语法树,因此无法获得等效的Groovy代码的输出。


查看完整回答
反对 回复 2019-10-17
?
月关宝盒

TA贡献1772条经验 获得超5个赞

如果您想了解更多有关它的信息,请在类的gradle源代码中检查transformVariableExpression函数。TaskDefinitionScriptTransformer


private void transformVariableExpression(MethodCallExpression call, int index) {

        ArgumentListExpression args = (ArgumentListExpression) call.getArguments();

        VariableExpression arg = (VariableExpression) args.getExpression(index);

        if (!isDynamicVar(arg)) {

            return;

        }


        // Matches: task args?, <identifier>, args? or task(args?, <identifier>, args?)

        // Map to: task(args?, '<identifier>', args?)

        String taskName = arg.getText();

        call.setMethod(new ConstantExpression("task"));

        args.getExpressions().set(index, new ConstantExpression(taskName));

    }

其转换task args?, <identifier>, args?或task(args?, <identifier>, args?)给task(args?, '<identifier>', args?) 它发现在的build.gradle任务定义,并添加周围的标识符(任务名称)的报价,以便能常规编译它没有问题。


查看完整回答
反对 回复 2019-10-17
  • 2 回答
  • 0 关注
  • 680 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信