Перейти к основному содержимому

Пользовательская задача в Gradle

· 6 мин. чтения

1. Обзор

В этой статье мы расскажем, как создать пользовательскую задачу в Gradle . Мы покажем новое определение задачи с использованием сценария сборки или пользовательского типа задачи.

Ознакомление с Gradle см. в этой статье . Он содержит основы Gradle и, что наиболее важно для этой статьи, введение в задачи Gradle.

2. Пользовательское определение задачи внутри build.gradle

Чтобы создать простую задачу Gradle, нам нужно добавить ее определение в наш файл build.gradle :

task welcome {
doLast {
println 'Welcome in the ForEach!'
}
}

Основная цель вышеуказанной задачи — просто напечатать текст «Добро пожаловать в ForEach!». Мы можем проверить , доступна ли эта задача , выполнив команду gradle tasks –all :

gradle tasks --all

Задача находится в списке в группе Другие задачи :

Other tasks
-----------
welcome

Его можно выполнить так же, как и любую другую задачу Gradle:

gradle welcome

Вывод ожидаемый — «Добро пожаловать в ForEach!» сообщение.

Примечание: если опция –all не установлена, то задачи, относящиеся к категории «Другое», не отображаются. Пользовательская задача Gradle может принадлежать к группе, отличной от «Другое», и может содержать описание.

3. Установите группу и описание

Иногда удобно группировать задачи по функциям, чтобы они были видны в одной категории. Мы можем быстро установить группу для наших пользовательских задач, просто определив свойство группы :

task welcome {
group 'Sample category'
doLast {
println 'Welcome on the ForEach!'
}
}

Теперь, когда мы запустим команду Gradle, чтобы вывести список всех доступных задач ( опция –all больше не нужна), мы увидим нашу задачу в новой группе:

Sample category tasks
---------------------
welcome

Однако другим также полезно видеть, за что отвечает та или иная задача. Мы можем создать описание , которое содержит краткую информацию:

task welcome {
group 'Sample category'
description 'Tasks which shows a welcome message'
doLast {
println 'Welcome in the ForEach!'
}
}

Когда мы печатаем список доступных задач, вывод будет следующим:

Sample category tasks
---------------------
welcome - Tasks which shows a welcome message

Такой вид определения задачи называется специальным определением .

Более того, полезно создать настраиваемую задачу, определение которой можно использовать повторно. Мы расскажем, как создать задачу из типа и как сделать некоторые настройки доступными для пользователей этой задачи.

4. Определите тип задачи Gradle внутри build.gradle

Вышеупомянутое «приветственное» задание нельзя настроить, поэтому в большинстве случаев оно не очень полезно. Мы можем запустить его, но если он нам нужен в другом проекте (или подпроекте), нам нужно скопировать и вставить его определение.

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

class PrintToolVersionTask extends DefaultTask {
String tool

@TaskAction
void printToolVersion() {
switch (tool) {
case 'java':
println System.getProperty("java.version")
break
case 'groovy':
println GroovySystem.version
break
default:
throw new IllegalArgumentException("Unknown tool")
}
}
}

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

Задача PrintToolVersionTask содержит свойство инструмента, которое может быть настроено экземплярами этой задачи:

String tool

Мы можем добавить столько свойств, сколько захотим — имейте в виду, что это просто простое поле класса Groovy.

Кроме того, он содержит метод с аннотацией @TaskAction . Он определяет, что делает эта задача . В этом простом примере выводится версия установленной Java или Groovy — зависит от заданного значения параметра.

Чтобы запустить пользовательскую задачу на основе созданного типа задачи, нам нужно создать новый экземпляр задачи этого типа :

task printJavaVersion(type : PrintToolVersionTask) {
tool 'java'
}

Наиболее важные части:

  • наша задача относится к типу PrintToolVersionTask , поэтому при выполнении она вызовет действие, определенное в методе, аннотированном @TaskAction.
  • мы добавили настраиваемое значение свойства инструмента ( java ), которое будет использоваться PrintToolVersionTask .

Когда мы запускаем вышеуказанную задачу, результат будет таким, как и ожидалось (зависит от установленной версии Java):

> Task :printJavaVersion 
9.0.1

Теперь давайте создадим задачу, которая печатает установленную версию Groovy:

task printGroovyVersion(type : PrintToolVersionTask) {
tool 'groovy'
}

Он использует тот же тип задачи, который мы определили ранее, но имеет другое значение свойства инструмента. Когда мы выполняем эту задачу, она печатает версию Groovy:

> Task :printGroovyVersion 
2.4.12

Если у нас не слишком много пользовательских задач, то мы можем определить их прямо в файле build.gradle (как мы сделали выше). Однако, если их больше нескольких, то наша сборка. gradle становится трудно читать и понимать.

К счастью, Gradle предоставляет для этого несколько решений.

5. Определите тип задачи в папке buildSrc.

Мы можем определить типы задач в папке buildSrc , которая находится на корневом уровне проекта . Gradle компилирует все, что находится внутри, и добавляет типы в путь к классам, чтобы наш скрипт сборки мог их использовать.

Наш тип задачи, который мы определили ранее ( PrintToolVersionTask ), можно переместить в buildSrc/src/main/groovy/com/foreach/PrintToolVersionTask.groovy . Нам нужно только добавить некоторые импорты из Gradle API в перемещенный класс .

Мы можем определить неограниченное количество типов задач в папке buildSrc . Его легче поддерживать, читать, а объявление типа задачи находится не в том же месте, что и инстанцирование задачи.

Мы можем использовать эти типы так же, как мы используем типы, определенные непосредственно в скрипте сборки. Мы должны помнить только о добавлении соответствующего импорта.

6. Определите тип задачи в плагине

Мы можем определить пользовательские типы задач внутри пользовательского плагина Gradle. Пожалуйста, обратитесь к этой статье , в которой описывается, как определить собственный плагин Gradle, определенный в:

  • `файл build.gradle`
  • папка buildSrc , как и другие классы Groovy

Эти пользовательские задачи будут доступны для нашей сборки, когда мы определим зависимость от этого плагина. Обратите внимание, что также доступны специальные задачи, а не только настраиваемые типы задач.

7. Заключение

В этом уроке мы рассмотрели, как создать пользовательскую задачу в Gradle. Существует множество доступных плагинов, которые вы можете использовать в своем файле build.gradle , которые предоставят множество необходимых вам настраиваемых типов задач.

Как всегда, фрагменты кода доступны на Github .