何时使用"<<"在Gradle任务中

时间:2014-08-01 01:20:28

标签: groovy gradle

有时候我会看到:

task hey << {
    println "Hello, Gradle!"
}

其他时候我看到:

task hey {
    println "Hello, Gradle!"
}

何时使用“<<”以及何时不使用(及其原因)?

3 个答案:

答案 0 :(得分:8)

<<doLast的简写。你问题中的任务并不等同。

这个任务:

task hey << {
    println "Hello, Gradle!"
}

等同于此任务:

task hey {
    doLast {
        println "Hello, Gradle!"
    }
}

无论您是否正在运行该特定任务,每次执行构建脚本时,第二个示例中的代码都将执行。例如,如果您有以下任务然后运行gradle goodbye,您会看到&#34; Hello,World!&#34;和#34;再见,世界!&#34;即使你只是在执行&#34;再见&#34;任务:

task hello {
    println "Hello, world!"
}

task goodbye {
    println "Goodbye, world!"
}

结果:

$ gradle goodbye
Hello, world!
Goodbye, world!
:goodbye UP-TO-DATE

但是,如果您更新了任务定义以使用<<doLast(例如task hello << {}),那么您只会看到执行任务中的println。< / p>

Adam Murdoch描述了任务中的代码何时将在this post中执行。我在这里引用了一些相关信息:

  

与任务相关的代码有2个不同的时间点   执行:第一个是配置时间,即构建时   脚本执行。这个想法是在这个时候你配置任务,   这样它就可以在另一个时间点做正确的事情,即   执行时间处理时间。执行时间是任务的时间点   做它的实际工作,并且仅在选择任务时才会发生   执行,并在其依赖执行后。

     

每个任务都有一系列操作,这些操作按顺序运行   任务执行时指定。一个动作只是一个闭包或一个   行动实施。 doFirst()方法配置要添加的任务   序列开始时的动作。 doLast()和&lt;&lt;方法   配置任务以在序列结束时添加操作。

答案 1 :(得分:2)

来自the Gradle documentation

此:

task hello {
    doLast {
        println 'Hello world!'
    }
}

可写成:

task hello << {
    println 'Hello world!'
}

组合doc中的语句(示例6.10附近):

  

&lt;&lt; operator只是doLast的别名(它将操作添加到任务操作列表的末尾)

答案 2 :(得分:0)

您可能希望使用doLast表示法的时间是您希望将任务定义与任务配置相结合。所以不要单独做它们:

task helloCopy << {
    println "hello"
}

task(helloCopy, type: Copy) {
    from(file('srcDir'))
    into(buildDir)
}

...如果您愿意,可以执行以下操作:

task(helloCopy, type: Copy) {
    from(file('srcDir'))
    into(buildDir)

    doLast {
        println "hello"
    }
}

您是否更喜欢这种风格是个人偏好,但它会将任务的所有规格保持在一起。