以下代码定义了4个gradle任务:
4.times { counter ->
task "task$counter" << {
println "I'm task number $counter"
}
}
但是什么是&lt;&lt;运营商?它在groovy中做了什么?
答案 0 :(得分:43)
<<
是一个左移算子。在这种情况下,task "task$counter"
是Task
对象声明,并且<<
被重载为doLast
方法的别名,该方法将闭包附加到要执行的操作列表执行任务时。
如果您没有指定<<
,那么关闭将被视为configuration closure,并且会在项目的配置阶段build lifecycle默认执行。无论在命令行上给出什么任务参数,都是如此。
示例:强>
如果您采用问题中指定的配置:
4.times { counter ->
task "task$counter" << {
println "I'm task number $counter"
}
}
运行gradle task3
,输出结果为:
:task3
I'm task number 3
因为每个闭包都被定义为特定于任务的执行操作。由于task3
被命名为要执行的任务,因此这是唯一执行的操作闭包。
但是如果删除<<
并按如下方式进行配置:
4.times { counter ->
task "task$counter" {
println "I'm task number $counter"
}
}
然后运行gradle task3
,输出将为:
I'm task number 0
I'm task number 1
I'm task number 2
I'm task number 3
:task3 UP-TO-DATE
这是因为所有闭包都被定义为配置任务本身,而不是在运行任务时作为操作执行。因此,在这种情况下,Gradle在配置项目时执行了所有闭包,然后当执行 task3
时,没有要执行的操作,因此它将任务报告为{ {1}}。
答案 1 :(得分:25)