Gradle е приложение за автоматизиране на проектите, чиято цел е да сглоби (build) даден проект, използвайки концепциите на Apache Ant и Apache Maven, като също така добавя и предметно ориентиран език базиран на Groovy и Kotlin вместо традиционния и широко използван XML формат за деклариране на конфигурациите към проекта.

Gradle
Информация
РазработчикHans Dockter, Adam Murdoch, Szczepan Faber, Peter Niederwieser, Luke Daley, Rene Gröschke, Daz DeBoer, Steve Appling
Последна версия1.6[1]
Програмен езикJava, Groovy
Операционна системамултиплатформен
Статусактивен
Вид софтуерПриложение за билдване
ЛицензApache License 2.0
Уебсайтwww.gradle.org
Gradle в Общомедия

За разлика от Apache Maven, който дефинира жизнен цикъл и Apache Ant, където редът на изпълнение на задачите (targets) се определя от зависимости (depends-on), Gradle си служи с директен ацикличен граф (DAG), за да се установи реда, в който отделните задачи (tasks) ще бъдат изпълнени.

Gradle е проектиран за проекти, които се състоят от много билдове (multi-project builds), чиято големина може да се увеличи с времето и да станат значителни по обем и времеемки за сглобяване всеки път наново. Поради тази причина той поддържа инкрементални (incremental) билдове. Чрез интелигентно установяване кои части от дървото на билда не са променяни, Gradle съкращава значително времето за билдване, тъй като задачите, които зависят от тях няма нужда да бъдат изпълнявани отново, тъй като де факто кодът за тях не е променян.

Първоначалните плъгини, които предоставя Gradle са фокусирани около Java, Groovy и Scala езици за програмиране.

Пример за Java проект редактиране

В примера предполагаме, че се използва директорийната структура на Apache Maven, която се използва за Java код и ресурси. Тези директории са: src/main/java, src/main/resources, src/test/java и src/test/resources.

build.gradle

apply plugin: 'java'

Изпълнявайки gradle build, резултата, който ще получим е

> gradle build
:compileJava
:processResources
:classes
:jar
:assemble
:compileTestJava
:processTestResources
:testClasses
:test
:check
:build

BUILD SUCCESSFUL

Плъгинът за Java емулира много от приложените в Maven жизнени цикли като задачи в ацикличния граф на зависимостите. Тези задачи са зависими по вход и изход една от друга. Например задачата build зависи от изхода на задачите check и assemble. Освен това, check зависи от test, и assemble зависи от jar.

За проекти, които не спазват конвенциите на Maven, Gradle дава възможност структурата на директориите да бъде допълнително конфигурирана. В следващия пример проекта ще съхранява файловете със сорс кода си в src/java, а не в src/main/java както е по конвенцията на Maven.

build.gradle

apply plugin: 'java'
sourceSets.main.java.srcDirs = ['src/java']

Задачи (Tasks) редактиране

Една от основните концепции в Gradle са задачите(tasks).

Подразбиращи се задачи редактиране

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

gradle -q tasks

Резултатът от изпълнението на командата е:

hello-world $gradle -q tasks
-----------------------------------------------------
All tasks runnable from root project
-----------------------------------------------------
Help tasks
----------
dependencies – Displays the dependencies of root project 'hello-world'.
help – Displays a help message
projects – Displays the sub-projects of root project 'hello-world'.
properties – Displays the properties of root project 'hello-world'.
tasks – Displays the tasks runnable from root project 'hello-world'
(some of the displayed tasks may belong to subprojects).
Other tasks
-----------
helloWorld
To see all tasks and more detail, run with --all.

Където в Other tasks се листват дефинираните от нас задачи, ако предварително не сме конфигурирали група, в която да участват.

Дефиниране на задачи редактиране

Всеки проект се състои от една или повече задачи, които изпълняват различни действия (actions), така че задачите се изграждат от действия. Тези действия се изпълняват, когато дадената задача се изпълнява. Gradle дава възможност да се добавят действия по няколко начина.

Може да се използва doFirst и doLast методите, за да се добави действие към дадена задача или може да се използва оператора за ляво отместване (<<) като еквивалентен на doLast метода. С doLast метода и с оператора за ляво отместване (<<) ние можем да добавяме действия към края на дадена задача, докато с doFirst, към началото.

task first {
 doFirst {
  println 'begin'
 }

 doLast {
  println 'middle'
 }
}

 first << {
  println 'end'
 }

И съответно резултатът от изпълнението ще бъде:

 >gradle first
 :first
 begin
 middle
 end

Съществуват и други различни начини за дефиниране на задачи – един от тях е използването на string стойност като име, за да дефинираме нова задача

task 'first' << {
 println 'This is my first task'
}

Описание на задача редактиране

За да добавим допълнителна информация към нашата задача, н.р. описание на нейното действие може да използваме свойството на всяка една задача – description. Стойността на това свойство се използва от Gradle задачата tasks. За да добавим описание към нашата задача трябва да направим следното:

task first {
   description = 'This is my first task'
}

или еквивалентното

task first(description: 'This is my first task') << {
  println 'first'
}

Сега след като изпълним задачата tasks ще получим

$ gradle tasks --all
...
Other tasks
-----------
first – This is my first task
...

Групиране на задачи редактиране

Gradle също така позволява и групирането на няколко задачи в групи чрез използването на свойството group. Група от задачи е множество от задачи, които са свързани логически едни с други. Тези групи от задачи се използват, например при изхода на задачата tasks.

task first {
   description = 'This is my first task'
   group = 'MyGroup'
}

Сега ако отново изпълним задачата tasks ще получим

$ gradle tasks --all
...
MyGroup tasks
-----------
first – This is my first task
...

Източници редактиране