Скрипт сборки Gradle описывает один или несколько проектов. Каждый проект состоит из разных задач. Задача — это часть работы, которую выполняет сборка. Задачей может быть компиляция некоторых классов, хранение файлов классов в отдельной целевой папке, создание JAR, генерация Javadoc или публикация некоторых достижений в репозитории.
В этой главе объясняется, что такое задача, а также как ее создать и выполнить.
Определение задач
Задача — это ключевое слово, которое используется для определения задачи в сценарии сборки. Посмотрите на следующий пример, который представляет задачу с именем hello, которая печатает tutorialspoint . Скопируйте и сохраните следующий скрипт в файл с именем build.gradle . Этот сценарий сборки определяет имя задачи hello, которое используется для печати строки tutorialspoint.
task hello { doLast { println 'tutorialspoint' } }
Выполните следующую команду в командной строке. Он выполняет вышеуказанный скрипт. Вы должны выполнить это там, где хранится файл build.gradle.
C:\> gradle –q hello
Выход:
tutorialspoint
Вы можете упростить эту задачу приветствия, указав ярлык (представляет символ << ) для оператора doLast . Если вы добавите этот ярлык к вышеупомянутой задаче, привет, он будет выглядеть как следующий скрипт.
task hello << { println 'tutorialspoint' }
Вы можете выполнить приведенный выше скрипт с помощью команды gradle –q hello .
Вот несколько вариантов определения задачи, посмотрите на нее. В следующем примере определяется задача hello .
Скопируйте и сохраните следующий код в файл build.gradle .
task (hello) << { println "tutorialspoint" }
Выполните следующую команду в командной строке. Он выполняет приведенный выше скрипт. Вы должны выполнить это, где хранится файл build.gradle.
C:\> gradle –q hello
Выход:
tutorialspoint
Вы также можете использовать строки для имен задач. Взгляните на тот же самый привет пример. Здесь мы будем использовать String как задачу.
Скопируйте и сохраните следующий код в файл build.gradle .
task('hello') << { println "tutorialspoint" }
Выполните следующую команду в командной строке. Он выполняет приведенный выше скрипт. Вы должны выполнить это, где хранится файл build.gradle.
C:\> gradle –q hello
Выход:
tutorialspoint
Вы также можете использовать альтернативный синтаксис для определения задачи. Это использует метод create () для определения задачи. Взгляните на тот же самый привет пример, приведенный ниже.
Скопируйте и сохраните приведенный ниже код в файл build.gradle .
tasks.create(name: 'hello') << { println "tutorialspoint" }
Выполните следующую команду в командной строке. Он выполняет приведенный выше скрипт. Вы должны выполнить это, где хранится файл build.gradle.
C:\> gradle –q hello
Выход:
tutorialspoint
Поиск задач
Если вы хотите найти задачи, которые вы определили в файле сборки, вам нужно использовать соответствующие стандартные свойства проекта. Это означает, что каждая задача доступна как свойство проекта, используя имя задачи в качестве имени свойства.
Взгляните на следующий код, который обращается к задачам как к свойствам.
Скопируйте и сохраните приведенный ниже код в файл build.gradle .
task hello println hello.name println project.hello.name
Выполните следующую команду в командной строке. Он выполняет приведенный выше скрипт. Вы должны выполнить это, где хранится файл build.gradle.
C:\> gradle –q hello
Выход:
hello hello
Вы также можете использовать все свойства через коллекцию задач.
Скопируйте и сохраните следующий код в файл build.gradle .
task hello println tasks.hello.name println tasks['hello'].name
Выполните следующую команду в командной строке. Он выполняет приведенный выше скрипт. Вы должны выполнить это, где хранится файл build.gradle.
C:\> gradle –q hello
Выход:
hello hello
Вы также можете получить доступ к пути задачи, используя задачи. Для этого вы можете вызвать метод getByPath () с именем задачи, либо относительным путем, либо абсолютным путем.
Скопируйте и сохраните приведенный ниже код в файл build.gradle .
project(':projectA') { task hello } task hello println tasks.getByPath('hello').path println tasks.getByPath(':hello').path println tasks.getByPath('projectA:hello').path println tasks.getByPath(':projectA:hello').path
Выполните следующую команду в командной строке. Он выполняет приведенный выше скрипт. Вы должны выполнить это, где хранится файл build.gradle.
C:\> gradle –q hello
Выход:
:hello :hello :projectA:hello :projectA:hello
Добавление зависимостей к задачам
Вы можете сделать задачу зависимой от другой задачи, что означает, что когда одна задача выполнена, тогда запускается только другая задача. Каждое задание отличается от имени задания. Коллекция имен задач называется ее коллекцией задач. Чтобы сослаться на задачу в другом проекте, вы должны использовать путь к проекту в качестве префикса к соответствующему имени задачи.
Следующий пример, который добавляет зависимость из taskX в taskY.
Скопируйте и сохраните приведенный ниже код в файл build.gradle . Посмотрите на следующий код.
task taskX << { println 'taskX' } task taskY(dependsOn: 'taskX') << { println "taskY" }
Выполните следующую команду в командной строке. Он выполняет приведенный выше скрипт. Вы должны выполнить это, где хранится файл build.gradle .
C:\> gradle –q taskY
Выход:
taskX taskY
Приведенный выше пример добавляет зависимость от задачи, используя ее имена. Существует еще один способ достижения зависимости задачи, который заключается в определении зависимости с помощью объекта Task.
Давайте возьмем тот же пример зависимости задачиY от задачи X, но мы используем объекты задачи вместо имен ссылок на задачи.
Скопируйте и сохраните следующий код в файл build.gradle .
task taskY << { println 'taskY' } task taskX << { println 'taskX' } taskY.dependsOn taskX
Выполните следующую команду в командной строке. Вы должны выполнить это там, где хранится файл build.gradle.
C:\> gradle –q taskY
Выход:
taskX taskY
Приведенный выше пример добавляет зависимость от задачи, используя ее имена. Есть еще один способ достижения зависимости задачи — определить зависимость с помощью объекта Task.
Здесь мы берем тот же пример, что taskY зависит от taskX, но мы используем объекты задачи вместо имен ссылок на задачи. Взгляните на это.
Скопируйте и сохраните приведенный ниже код в файл build.gradle . Посмотрите на следующий код.
task taskX << { println 'taskX' } taskX.dependsOn { tasks.findAll { task → task.name.startsWith('lib') } } task lib1 << { println 'lib1' } task lib2 << { println 'lib2' } task notALib << { println 'notALib' }
Выполните следующую команду в командной строке. Он выполняет приведенный выше скрипт. Вы должны выполнить это, где хранится файл build.gradle .
C:\> gradle –q taskX
Выход:
lib1 lib2 taskX
Добавление описания к задаче
Вы можете добавить описание к вашей задаче. Это описание отображается при выполнении задач Gradle . Это возможно с помощью ключевого слова description.
Скопируйте и сохраните следующий код в файл build.gradle . Посмотрите на следующий код.
task copy(type: Copy) { description 'Copies the resource directory to the target directory.' from 'resources' into 'target' include('**/*.txt', '**/*.xml', '**/*.properties') println("description applied") }
Выполните следующую команду в командной строке. Вы должны выполнить это там, где хранится файл build.gradle.
C:\> gradle –q copy
Если команда выполнена успешно, вы получите следующий вывод.
description applied
Пропуск задач
Пропуск задач может быть выполнен путем передачи предиката замыкания. Это возможно только в том случае, если метод задачи или замыкание генерируют исключение StopExecutionException до выполнения фактической работы задачи.
Скопируйте и сохраните следующий код в файл build.gradle .
task eclipse << { println 'Hello Eclipse' } // #1st approach - closure returning true, if the task should be executed, false if not. eclipse.onlyIf { project.hasProperty('usingEclipse') } // #2nd approach - alternatively throw an StopExecutionException() like this eclipse.doFirst { if(!usingEclipse) { throw new StopExecutionException() } }
Выполните следующую команду в командной строке. Вы должны выполнить это там, где хранится файл build.gradle.
C:\> gradle –q eclipse
Структура задачи
Gradle имеет разные фазы при работе с заданиями. Прежде всего, это фаза конфигурации, на которой выполняется код, который указывается непосредственно при закрытии задачи. Блок конфигурации выполняется для каждой доступной задачи, а не только для тех задач, которые впоследствии фактически выполняются.
После фазы конфигурирования фаза выполнения запускает код внутри замыканий doFirst или doLast тех задач, которые фактически выполняются.