Gradle任务差异

end*_*ian 10 gradle

以下两个代码片段之间的区别是什么?

第一:

task copyFiles(type: Copy) << {
  from "folder/from"
  into "dest/folder"
}
Run Code Online (Sandbox Code Playgroud)

第二:

task copyFiles(type: Copy) {
  from "folder/from"
  into "dest/folder"
}
Run Code Online (Sandbox Code Playgroud)

Pet*_*ser 16

简而言之,第一个片段是错误的,第二个片段是正确的.

Gradle构建分三个阶段进行:初始化,配置和执行.类似frominto 配置任务的方法,因此需要在配置阶段调用它们.但是,<<(这是一个快捷方式doLast)增加了一个任务操作 -它指示任务做什么,如果它被执行.换句话说,第一个代码段在执行阶段配置任务,更糟糕的是,执行主(复制)操作之后.因此配置不会有任何影响.

通常情况下,一个任务有两种类型(已沿着任务操作带来的)一个<<(对于一个特设的任务).有两种合法的用例(在任务的"主要"工作之后进行一些自定义工作),但更常见的是没有,这是任务配置得太晚的错误.

我通常建议使用doLast而不是<<,因为它不那么神秘,并且更容易发现这样的错误.(一旦你理解了这些概念,那很明显task copyFiles(type: Copy) { doLast { from ... } }是错误的.)