在build.gradle中的Gradle任务方法语法

4

我是Gradle和Groovy的新手,正在阅读Gradle的用户指南,并对任务方法中的一些语法问题有疑问:

task intro(dependsOn: hello) {
   doLast { println "I'm Gradle" }  
}

问题1:在上面的代码中,Project API 中调用了哪个方法?我知道API中有四种重载:

Task task(String name, Closure configureClosure);
Task task(Map<String, ?> args, String name, Closure configureClosure);
Task task(Map<String, ?> args, String name) throws InvalidUserDataException;
Task task(String name) throws InvalidUserDataException;

但是像 intro(dependsOn: hello) 或者 copy(type: Copy) 这样的参数让我感到困惑,如果加上括号会怎么样呢?

问题2:为什么 << 是 doLast 方法的速记?我的意思是,Task API 中有一个 leftshift 方法吗?它们之间有什么区别?

问题3:为什么可以在 build.gradle 中使用 tasks.create() 方法 17.1. 定义任务,我没有在 Project API 或者 AbstractProject 源代码中看到 tasks 属性。


我知道有一些类似的问题什么是Groovy语言中的Gradle任务定义?,但我仍然希望能够找到更多关于这些的答案。 - WesleyHsiung
1个回答

1
在这种特定情况下:
task intro(dependsOn: hello) {
   doLast { println "I'm Gradle" }  
}

下面的方法将被调用:
Task task(Map<String, ?> args, String name, Closure configureClosure);

由于Gradle使用特定的DSL,可能很难判断,但是:

  1. Q1

    • intro 是一个 String name 参数
    • dependsOn: hello 相当于 [dependsOn: hello] (一个 Map),是 Map<String, ?> args
    • { doLast { println "I'm Gradle" } }Closure configureClosure
  2. Q2

<<doLast 的简写,只是为了更加简洁。你可以使用 doLast<<leftShift - 它们都是一样的。 leftShift 被重载 - 参见 这里

  1. Q3

没有 tasks 方法,但是有 getTasks 方法,详见这里。这是groovy的工作方式 - 如果方法是getter,()get 可以省略,所以 project.getTasks() 等同于 project.tasks


1
非常感谢,这对我非常有帮助。我发现Gradle的语法与Groovy的语法不同,并且在build.gradle中的task方法是通过TaskDefinitionScriptTransformer解析的。 - WesleyHsiung
@VincentHsiung,是的,没错。Gradle使用专门的DSL,它利用了Groovy语言。如果您觉得我的回答有帮助,请接受它。 - Opal
非常感谢您的解释,我有几个问题:
  1. 为什么没有逗号来分隔参数,我记得Groovy需要它
  2. 为什么顺序不匹配,签名需要参数然后是名称
  3. 在Gradle中使用的Groovy是否与“正常”的Groovy使用相同的语法
- HKIT

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接