Спеціальне завдання в Gradle

1. Огляд

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

Для ознайомлення з Gradle див. Цю статтю. Він містить основи Gradle та - що найважливіше для цієї статті - вступ до завдань Gradle.

2. Визначення спеціального завдання всередині build.gradle

Щоб створити просте завдання Gradle, нам потрібно додати його визначення до нашого файлу build.gradle :

task welcome { doLast { println 'Welcome in the 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 

Цей тип визначення завдання називається спеціальним визначенням .

Далі корисно створити настроюване завдання, визначення якого можна використовувати повторно. Ми розглянемо, як створити завдання із типу та як зробити деякі налаштування доступними для користувачів цього завдання.

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.