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

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

1. обзор

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

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

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

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

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

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

gradle tasks --all

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

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

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

gradle welcome

Результат ожидаемый - «Добро пожаловать в пример!» сообщение.

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

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

Иногда бывает удобно сгруппировать задачи по функциям, чтобы они были видны в одной категории. Мы можем быстроsetgroup for our custom tasks, just by defining a group property:

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

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

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

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

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

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

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

Такое определение задачи называетсяad-hoc definition.

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

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

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

Мы можем быстроenable customization of the task by creating a task type. Просто тип задачи определяется внутри скрипта сборки:

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")
        }
    }
}

Acustom task type is a simple Groovy class which extends DefaultTask - класс, определяющий стандартную реализацию задачи. Есть и другие типы задач, от которых мы можем расширить, но в большинстве случаев классDefaultTask является подходящим выбором.

PrintToolVersionTasktask contains tool property which can be customized by instances этой задачи:

String tool

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

Кроме того, он содержитmethod annotated with @TaskAction. It defines what this task is doing. В этом простом примере он печатает версию установленной Java или Groovy - зависит от заданного значения параметра.

Чтобы запустить настраиваемую задачу на основе созданного типа задачи, нам нужноcreate a new task instance of this type:

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

Самые важные части:

  • наша задача - типPrintToolVersionTask, поэтомуwhen executed it’ll trigger the action defined in the method annotated with @TaskAction

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

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

> Task :printJavaVersion
9.0.1

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

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

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

> Task :printGroovyVersion
2.4.12

If we have not too many custom tasks, then we can define them directly in the build.gradle file (как мы сделали выше). Однако, если их больше, чем несколько, наш файл sgradlebuild.становится трудным для чтения и понимания.

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

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

Мы можемdefine task types in the buildSrc folder which is located at the root project level. Gradle компилирует все, что находится внутри, и добавляет типы в путь к классам, чтобы наш сценарий сборки мог использовать его.

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

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

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

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

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

  • build.gradle файл

  • ПапкаbuildSrc, как и другие классы Groovy

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

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

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

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