我是Gradle和Groovy的新手,并试图理解在定义gradle任务时在groovy级别上发生了什么。
task hello {
println "configuring task hello"
doLast {
println "hello there"
}
}
通过阅读"Gradle In Action“这本书,我知道task hello {}
实际上是对groovy Project
接口的task()
方法的调用。在第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在task hello { }
中解释hello
的有一个groovy编译器插件可以将task hello { }
转换成task('hello', { })
我的问题:
gradle
命令打印出编译器插件运行后生成的基本groovy代码?发布于 2014-12-21 05:37:43
Gradle使用AST Transformations扩展了Groovy语法。您提到的任务定义语法只是Gradle应用的转换之一。您可以找到该转换here的实现。要回答您的特定问题:
据我所知,
语法的超集。任何有效的Groovy在Gradle脚本中也是有效的,但是Gradle脚本不一定(通常不是)有效的“默认”Groovy。
发布于 2019-07-23 14:54:31
如果您想了解更多信息,请查看TaskDefinitionScriptTransformer
类中gradle源代码中的transformVariableExpression function
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就可以顺利地编译它。
https://stackoverflow.com/questions/27584463
复制相似问题