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