Gradle Разница в задачах

В чем разница между следующими двумя фрагментами кода?

Сначала:

task copyFiles(type: Copy) << {
  from "folder/from"
  into "dest/folder"
}

Во-вторых:

task copyFiles(type: Copy) {
  from "folder/from"
  into "dest/folder"
}

Ответ 1

Короче говоря, первый фрагмент ошибочен, а второй - правильно.

A Gradle build продолжается в три этапа: инициализация, конфигурация и исполнение. Такие методы, как from и into, настраивают задачу, поэтому их необходимо вызвать на этапе конфигурации. Однако << (который является ярлыком для doLast) добавляет действие задачи - он инструктирует задачу, что делать, если и когда она будет выполнена. Другими словами, первый фрагмент настраивает задачу на этапе выполнения, а еще хуже, после того, как было выполнено ее основное (копирование) действие. Следовательно, конфигурация не будет иметь никакого эффекта.

Обычно задача имеет либо тип (который уже выполняет действие задачи), либо << (для специальной задачи). Существуют законные случаи использования для обоих (выполнение небольшой пользовательской работы после основной работы задачи), но чаще это не так, это ошибка, когда задача настраивается слишком поздно.

Обычно я рекомендую использовать doLast вместо <<, потому что он менее критический и облегчает выявление таких ошибок. (Как только вы понимаете концепции, очевидно, что task copyFiles(type: Copy) { doLast { from ... } } неверно.)

Ответ 2

Первый блок кода создает задачу и добавляет к ней действие. Задача состоит из действий, которые являются блоками инструкций, выполняемыми последовательно при вызове задачи

Второй блок создает задачу и настраивает ее. Эти инструкции выполняются на этапе жизненного цикла конфигурации gradle ".

здесь вы найдете четкое объяснение различий

здесь вы можете найти подробное объяснение задач gradle

здесь является справочником gradle о жизненном цикле