什么是gradle中的运算符<<(双倍小于)?

St.*_*rio 33 groovy gradle

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

4.times { counter ->
    task "task$counter" << {
        println "I'm task number $counter"
    }
}
Run Code Online (Sandbox Code Playgroud)

但什么是<<运营商?它在groovy中做了什么?

hee*_*nee 44

<<是一个左移算子.在这种情况下,task "task$counter"是一个Task对象声明,并<<作为doLast方法的别名重载,该方法将闭包附加到执行任务时要执行的操作列表.

如果未指定<<,则闭包将被视为配置闭包,并且将在项目的构建生命周期的配置阶段默认执行,而不管命令行上给出的任何任何参数.

例:

如果您采用问题中指定的配置:

4.times { counter ->
    task "task$counter" << {
        println "I'm task number $counter"
    }
}
Run Code Online (Sandbox Code Playgroud)

并运行gradle task3,输出将是:

:task3
I'm task number 3
Run Code Online (Sandbox Code Playgroud)

因为每个闭包都被定义为特定于任务的执行操作.因为task3被命名为要执行的任务,所以这是唯一执行的动作闭包.

但是如果你删除<<并进行如下配置:

4.times { counter ->
    task "task$counter" {
        println "I'm task number $counter"
    }
}
Run Code Online (Sandbox Code Playgroud)

然后运行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
Run Code Online (Sandbox Code Playgroud)

这是因为所有闭包都被定义为自己配置任务,而不是在运行任务时作为操作执行.因此,在这种情况下,Gradle在配置项目时执行了所有闭包,然后在执行时 task3,没有要执行的操作,因此它将任务报告为UP-TO-DATE.

  • 这个评论节省了我的一天! (3认同)
  • 很好的解释@heenenee (2认同)
  • 值得指出的是*在第二种情况下打印'我是任务编号N'的*4次,是在**每个任务**中完成的.不只是`taskN`s. (2认同)

Opa*_*pal 27

基本上这是一个leftShift操作员 - 您可以在这里找到更多详细信息.

在gradle中,<<运算符用于向特定任务添加操作.任务包括在执行任务期间运行的多个操作(按顺序添加).只是为任务动作集合添加一个动作.有关任务和操作的更多信息,请点击此处.<<