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 закрытие тех задач, которые фактически выполнены.