Персонализирана задача в Gradle

1. Общ преглед

В тази статия ще разгледаме как да създадете персонализирана задача в Gradle . Ще покажем нова дефиниция на задача, използвайки скрипт за компилация или персонализиран тип задача.

За въведение в Gradle, моля, вижте тази статия. Той съдържа основите на Gradle и - което е най-важното за тази статия - въведението в задачите на Gradle.

2. Дефиниция на персонализирана задача в build.gradle

За да създадем ясна задача Gradle, трябва да добавим нейната дефиниция към нашия файл build.gradle :

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

Основната цел на горната задача е просто да отпечатате текст „Добре дошли в Baeldung!“. Можем да проверим дали тази задача е налична, като стартираме gradle tasks –all команда:

gradle tasks --all 

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

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

Може да се изпълни точно както всяка друга задача на Gradle:

gradle welcome 

Резултатът е както се очаква - „Добре дошли в Baeldung!“ съобщение.

Забележка: ако опцията –всички не е зададена, тогава задачите, които принадлежат към категорията „Други“, не се виждат. Персонализираната задача Gradle може да принадлежи към група, различна от „Други“ и може да съдържа описание.

3. Задайте група и описание

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

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

Сега, когато стартираме командата Gradle, за да изброим всички налични задачи ( –всички опции вече не са необходими), ще видим нашата задача под нова група:

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

Полезно е обаче и за другите да видят за какво отговаря дадена задача. Можем да създадем описание, което съдържа кратка информация:

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

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

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

Този вид дефиниция на задача се нарича ad hoc дефиниция .

По-нататък е полезно да създадете персонализираща се задача, която дефиницията може да бъде използвана повторно. Ще разгледаме как да създадем задача от тип и как да направим някои персонализации достъпни за потребителите на тази задача.

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

We can define task types in the buildSrc folder which is located at the root project level. Gradle compiles everything that is inside and adds types to the classpath so our build script can use it.

Our task type which we defined before (PrintToolVersionTask) can be moved into the buildSrc/src/main/groovy/com/baeldung/PrintToolVersionTask.groovy. We have to only add some imports from Gradle API into a moved class.

We can define an unlimited number of tasks types in the buildSrc folder. It's easier to maintain, read, and the task type declaration isn't in the same place as the task instantiation.

We can use these types the same way we're using types defined directly in the build script. We have to remember only to add appropriate imports.

6. Define Task Type in the Plugin

We can define a custom task types inside a custom Gradle plugin. Please refer to this article, which describes how to define a custom Gradle plugin, defined in the:

  • build.gradle file
  • buildSrc folder as other Groovy classes

These custom tasks will be available for our build when we define a dependency to this plugin. Please note that ad-hoc tasks are also available – not only custom task types.

7. Conclusion

В този урок разгледахме как да създадем персонализирана задача в Gradle. Налични са много приставки, които можете да използвате във вашия файл build.gradle, които ще предоставят много персонализирани типове задачи, от които се нуждаете.

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