首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >了解gradle任务定义中的groovy语法

了解gradle任务定义中的groovy语法
EN

Stack Overflow用户
提问于 2014-12-21 05:23:40
回答 2查看 7.1K关注 0票数 87

我是Gradle和Groovy的新手,并试图理解在定义gradle任务时在groovy级别上发生了什么。

代码语言:javascript
复制
task hello  { 
   println "configuring task hello" 
   doLast {
     println "hello there" 
   }
}

通过阅读"Gradle In Action“这本书,我知道task hello {}实际上是对groovy Project接口的task()方法的调用。在第77页上,它显示了Project接口上有4个名为task的方法

代码语言:javascript
复制
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/438319task hello { }中解释hello的有一个groovy编译器插件可以将task hello { }转换成task('hello', { })

我的问题:

  • 我在哪里可以找到关于Gradle Groovy编译器插件的信息,该插件否认了Gradle脚本是groovy程序在技术上是错误的说法,因为gradle以某种方式扩展了Groovy编程语言?
  • 有没有办法让gradle命令打印出编译器插件运行后生成的基本groovy代码?
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-12-21 05:37:43

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

据我所知,

  • 应用的各个转换在任何地方都没有专门的文档。但是,您可以查看上面链接的同一个包中的其他类。Gradle脚本支持

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

  • 没有办法获得等效Groovy代码的输出,因为它是在内存中操作的实际抽象语法树。
票数 92
EN

Stack Overflow用户

发布于 2019-07-23 14:54:31

如果您想了解更多信息,请查看TaskDefinitionScriptTransformer类中gradle源代码中的transformVariableExpression function

代码语言:javascript
复制
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中找到任务定义,并在标识符(任务名称)两边添加引号,这样groovy就可以顺利地编译它。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27584463

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档