我是gradle和groovy的新手,我正在阅读Gradle的usr指南,并对任务方法有一些语法问题:
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:为什么&lt;&lt;是doLast
方法的简写?我的意思是leftshift
API中有Task
方法?他们之间的差异是什么?
问题3:为什么可以在build.gradle 17.1. Defining tasks中使用tasks.create()
方法,我在tasks
API或Project
来源中没有看到AbstractProject
属性代码。
答案 0 :(得分:1)
在这种特殊情况下:
task intro(dependsOn: hello) {
doLast { println "I'm Gradle" }
}
将调用以下方法:
Task task(Map<String, ?> args, String name, Closure configureClosure);
由于gradle使用特定的DSL,因此可能很难说:
Q1
intro
是String name
参数dependsOn: hello
相当于[dependsOn: hello]
(Map
)Map<String, ?> args
{ doLast { println "I'm Gradle" } }
是Closure configureClosure
Q2
<<
是doLast
的简写,只是为了让它更简洁。您可以使用doLast
,<<
,leftShift
- 它们都是一样的。覆盖了leftShift
- 请参阅here
没有这样的方法tasks
但getTasks
,请参阅here。这就是groovy的工作方式 - 如果方法是getter ()
并且get
可以省略,那么project.getTasks()
等同于project.tasks
。