什么是运营商<< (双倍小于)在gradle中?

时间:2014-09-28 13:32:30

标签: groovy gradle

以下代码定义了4个gradle任务:

4.times { counter ->
    task "task$counter" << {
        println "I'm task number $counter"
    }
}

但是什么是&lt;&lt;运营商?它在groovy中做了什么?

2 个答案:

答案 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)

基本上这是leftShift运算符 - 您可以找到更多详细信息here

在gradle中<<运算符用于将操作添加到特定的任务。任务包括在执行任务期间运行的多个操作(按顺序添加)。 <<只是为任务集合操作添加了一个操作。有关任务和操作的更多信息,请参见here