В файле построения градиента существует несколько способов указать элементы, выполняемые для конкретной задачи. метод doFirst помещает элемент задачи в начало стека задач, так что элемент выполняется до остальной части стека задач. Это очень удобно, если вам нужно сделать некоторые подготовительные элементы перед основной задачей. Фактически, если вы вызываете doFirst несколько раз, элемент, добавленный в последнем вызове, является первым, что выполняется.
Теоретически doLast должен делать что-то подобное, но doLast должен быть вызван ПОСЛЕ завершения основного выполнения задачи. Но в gradle 1.2, если вы вызываете doLast, а затем добавляете что-то к основной задаче после doLast в файле gradle.build, основным элементом задачи является последний вызванный элемент. Например, следующий файл сборки градиента:
task myTask
myTask << {
println "myTask main execution block"
}
myTask.doFirst {
println "myTask doFirst call one"
}
myTask.doFirst {
println "myTask doFirst call two"
}
myTask.doLast {
println "myTask doLast"
}
myTask << {
println "myTask more main execution block"
}
Производит следующий вывод:
:myTask
myTask doFirst call two
myTask doFirst call one
myTask main execution block
myTask doLast
myTask more main execution block
BUILD SUCCESSFUL
Total time: 1.585 secs
Мой вопрос заключается в следующем: намерено ли doLast просто добавить шаги в конец задачи (например, doFirst откладывает начало)? Если это так, doLast кажется бессмысленным, за исключением обеспечения симметрии doFirst. Пользователь может просто сделать myTask << {...}, чтобы добавить что-то до конца. Я бы подумал, что doLast будет следить за тем, чтобы любые элементы "doLast" выполнялись после основного блока выполнения.
Это просто способ, которым должен работать gradle doLast, или это ошибка? (или я просто глупо за то, что добавляю что-то в основной блок выполнения после вызова doLast - это была простая ошибка после привязки в другом исполнительном блоке).