Gradle doFirst和doLast的设计目的是什么?

Liu*_*ate 26 gradle

例如,我有Gradle脚本,如:

myTask_A {
    doFirst {
        println "first string"

    }
    doLast {
        println "last string"
    }
}
Run Code Online (Sandbox Code Playgroud)

以下两个任务具有完全相同的执行结果:

myTask_B {
    doFirst {
        println "first string"
        println "last string"
    }
}

myTask_C {
    doLast {
        println "first string"
        println "last string"
    }
}
Run Code Online (Sandbox Code Playgroud)

doFirst&doLast的设计目的是什么,因为上述任何任务都会产生相同的结果?

Alp*_*par 29

它与可扩展性,重用和避免重复有关.

对于一个内置任务可以扩展如下:

task CopyAndThen(type: Copy) {
   doFirst {
      println "this is before the actual copy"
   }
   doLast {
      println "this is after the actual copy"
   }
}
Run Code Online (Sandbox Code Playgroud)

想到的第二个常见场景是多项目构建,您可以在项目顶部使用常见行为定义任务定义:

allprojects {
    task myTask_a {
        doFirst {...}
    }
}
Run Code Online (Sandbox Code Playgroud)

然后具体项目可以扩展.该任务基本上有一个需要运行的闭包列表,以及插入到列表末尾的选项doFirstdoLast控件.

  • 它是一个有效的配置,每个`doFist`或`doLast`都是一个被添加到列表中的闭包,它们按顺序执行.多个`doLast`将按照它们被声明的顺序执行,而`doFrist`则按相反的顺序执行. (6认同)
  • 如果在一个任务中声明多个doFirsts或doLasts怎么办? (4认同)
  • 啊,谢谢.我真的希望它被命名为"addFirst/Last"或"insertFirst/Last",然后. (3认同)