Gradle - Задачи
Сценарий сборки Gradle описывает один или несколько проектов. Каждый проект состоит из разных задач. Задача - это часть работы, которую выполняет сборка. Задача может заключаться в компиляции некоторых классов, сохранении файлов классов в отдельной целевой папке, создании JAR, создании документации Javadoc или публикации некоторых достижений в репозиториях.
В этой главе объясняется, что такое задача, и как ее создать и выполнить.
Определение задач
Задача - это ключевое слово, которое используется для определения задачи в скрипте сборки. Взгляните на следующий пример, который представляет задачу с именемhello это печатает tutorialspoint. Скопируйте и сохраните следующий скрипт в файл с именемbuild.gradle. Этот сценарий сборки определяет имя задачи hello, которое используется для печати строки учебной точки.
task hello {
doLast {
println 'tutorialspoint'
}
}
Выполните следующую команду в командной строке. Он выполняет указанный выше сценарий. Вы должны выполнить это там, где хранится файл build.gradle.
C:\> gradle –q hello
Вывод:
tutorialspoint
Вы можете упростить эту задачу приветствия, указав ярлык (представляет собой символ <<) к doLastзаявление. Если вы добавите этот ярлык к указанной выше задачеhello это будет выглядеть как следующий сценарий.
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.
Давайте возьмем тот же пример, когда taskY зависит от taskX, но мы используем объекты задач вместо имен ссылок на задачи.
Скопируйте и сохраните следующий код в 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 tasks. Это возможно с помощью ключевого слова 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 закрытие тех задач, которые фактически выполнены.