gradle
DESCRIPTION
Short introduction in Gradle build tool.TRANSCRIPT
Установка:1.Скачиваем архив с Gradle:wget http://downloads.gradle.org/distributions/gradle-1.2-bin.zip2.Распаковываем архив:sudo unzip -q gradle-1.2-bin.zip -d /usr/local/3.Устнавливаем системные переменные:echo "export GRADLE_HOME=/usr/local/gradle-1.2" >> .profileecho "export PATH=$PATH:$GRADLE_HOME/bin" >> .profile4.Проверяем:gradle -version
Жизненный цикл в Gradle:1.Фаза инициализации (Initialization phase) - Gradle решает какие проекты будут участвовать в сборке.2.Фаза конфигурирования (Configuration phase) - объекты собраны во внутреннюю объектную модель (DAG - directed acyclic graph).testTask {
println 'Config Task';}3.Фаза исполнения (Execution phase) - задачи сборки выполняются в порядке разрешения зависимостей.testTask << {
println 'Execute Task'}
Жизненный цикл в Gradle:Примечание: весь код описанный как конфигурационный выполняется каждый раз при запуске файла сборки Gradle, вне зависимости от того, какое задание выполняется
Стандартное задание в Gradle:Каждое задание в Gradle имеет тип,по-умолчанию это тип стандартного задания (DefaultTask), на подобии java.lang.Object в Java коде. Стандартное задание на самом деле ничего не делает, а только содержит методы для взаимодейтсвия с объектной моделью проекта Gradle. Каждое задание в Gradle имеет следующие методы:1.dependsOn(task)2.doFirst(closure)3.doLast(closure)4.onlyIf(closure)
{println 'hi!'
}
для обозначения в Groovy используется термин "closure"
dependsOn(task)
Добавляет задание-зависимость для текущего задания.
task dependsTask << {println 'dependsTask'
}task testTask {
dependsOn dependsTask}testTask << {
println 'testTask'}
>>gradle testTask:dependsTaskdependsTask:testTasktestTask
dependsOn(task)
Примечание: задание-зависимость выполняется всегда перед текущим заданием и должно быть описано перед ним. Задание-зависимость для текущего задания определяется на фазе конфигурирования.
dependsOn(task)
Вызвать это метод можно и другими способами:task testTask(dependsOn: dependsTask)testTask.dependsOn dependsTaskdependsOn << dependsTaskdependsOn 'dependsTask'
testTask.dependsOn dependsTask1, dependsTask2task testTask(dependsOn: [dependsTask1, dependsTask2])
doFirst(closure)
Добавляет блок выполняемого кода, который будем вызван перед началом выполнения текущего задания.
task testTask << {println 'Task action'
}testTask.doFirst{
println 'Task prepare'}
>>gradle testTask:testTaskTask prepareTask action
doFirst(closure)
Данный метод может быть вызван внутри конфигурационного блока:task testTask {
doFirst{println 'doFirst method'
}}testTask << {
println 'Execute testTask'}
>>gradle testTask:testTaskdoFirst methodExecute testTask
doFirst(closure)
Примечание: повторные вызовы метода doFirst являются аддативными. Каждый предыдущий вызов исполняемого кода сохраняется, и каждый новый фрагмент исполняемого кода добавляется в начало списка для выполнения.
doFirst(closure)
task testTask <<{println 'Execute testTask'
}testTask.doFirst{
println 'doFirst definition 1'}testTask.doFirst{
println 'doFirst definition 2'}
>>gradle testTask:testTaskdoFirst definition 2doFirst definition 1Execute testTask
doLast(closure)
Добавляет блок выполняемого кода, который будем вызван после выполнения текущего задания.
task testTask << {println 'Task action'
}testTask.doLast{
println 'Task after'}
>>gradle testTask:testTaskTask actionTask after
doLast(closure)
Примечание: повторные вызовы метода doLast являются аддативными. Каждый предыдущий вызов исполняемого кода сохраняется, и каждый новый фрагмент исполняемого кода добавляется в конец списка для выполнения.
doLast(closure)
task testTask <<{println 'Execute testTask'
}testTask.doLast{
println 'doLast definition 1'}testTask.doLast{
println 'doLast definition 2'}
>>gradle testTask:testTaskExecute testTaskdoLast definition 1doLast definition 2
onlyIf(closure)
Позволяет описать предикат оперделяющий условие, когда задача может быть выполнена. Значение предиката является значением исполняемого кода в теле метода onlyIf
task testTask << {println 'Execute testTask'
}testTask.onlyIf {
System.properties['isLoad'] == 'true'}
>>gradle -DisLoad=true testTask:testTaskExecute testTask
>>gradle testTask:testTask SKIPPED
onlyIf(closure)
Примечание: использование данного метода позволяет переключаться между заданими в зависимости от определенных условий . Возможность использования Groovy кода позволяет в теле метода onlyIf читать файлы, вызывать веб-сервисы, проверять учетные записи, выполнять разнообразные операции.
Свойства стандартного задания в Gradle:Стандартное задание Gradle имеет следующие свойства:1.didWork2.enabled3.path4.logger5.logging6.description7.temporaryDir
didWork
Логическое свойство показывающее успешно ли выполнена задача. Пользователь может самостоятельно установить значение этого свойства, для отображения результата сборки кода.Для обозначения успешности своих действий значение данного свойства могут устанавливать некоторые стандартные задачи Gradle, такие как:1.Compile2.Copy3.Delete
enabled
Логическое свойство показывающее возможно ли выполнение текущего задания. Для запрета выполнения задания значение данного свойства должно быть false.task testTask << {
println 'Execute testTask'}testTask.enabled = true
task testTask << {println 'Execute testTask'
}testTask.enabled = false
>>gradle testTask:testTaskExecute testTask
>>gradle testTask:testTask SKIPPED
path
Строковое свойство содержащее полный путь к заданию. Значение данного свойства для файлов сборки верхнего уровня совпадает с именем задания, а для заданий которые расположены в подзаданиях формируется по следующему правилу::STN:TNSTN (Subtask name) - имя подзаданияTN (Task name) - имя задания в подзадании
logger
Свойство хранящее ссылку на внутренний логгер Gradle. Данный логгер реализует интерфейс org.slf4j.Logger с добавлением нескольких дополнительных уровней логирования.Уровни логгера Gradle:1.DEBUG2.INFO3.LIFECYCLE4.WARN5.QUIET6.ERROR
logging
Свойство представляющее уровень логирования встроенного логгера Gradle. Значение свойства logging.level может быть прочитано или записано для смены уровня логгирования при сборке.
description
Строковое свойство описывающее цель данного задания.Значение свойства можно задать несколькими способами:task testTask(description: 'Study Gradle') << {
println 'Test task'}task testTask << {
println 'Test task'}testTask {
description = 'Study Gradle'}
description
Один из способов задания свойства description:task testTask << {
println 'Test task'}testTask.description = 'Study Gradle'
temporaryDir
Свойство возвращает объект типа File, который указывает временный каталог для текущего файла сборки. Данный каталог используется для задач нуждающихся во временном сохранении результатов работы, либо для задач обработки файлов внутри задачи.
Типы заданий в Gradle
Каждое задание в Gradle имеет тип, кроме стандартного типа DefaultTask, есть типы задач для архивирования, выполнения программ и многого другого. Определение типа задания подобно механизму наследования в объектно-ориентированных языках программирования.В число наиболее важных типов заданий входят следующие:1.Copy2.Jar3.JavaExec
Copy
Данное задание копирует файлы с одного места в другое.task copyFiles(type: Copy) {
from 'resources'into 'target'include '**/*.xml', '**/*.txt', '**/*.properties'
}
Замечание:from, into и include методы наследуются от задания Copy
откудакудачто
Jar
Создает Jar файл из исходных файлов. Имеет широкие возможности для конфигурирования.apply plugin: 'java'task customJar(type: Jar) {
manifest {attributes firstKey: 'firstValue',
secondKey: 'secondValue'}archiveName = 'hello.jar'destinationDir = file("${buildDir}/jars")from sourceSets.main.classes
}
определяем пользовательскиеаттрибуты для файла манифеста
имя архивакуда сохранитькакие файлы
Jar
Примечание: задание Jar наследуется от задания Copy. Тип значения параметра distinationDir ожидается java.io.File, поэтому в примере используется метод file(), который всегда доступен внутри файла сборки Gradle. Метод file() переводит строковый объект указывающий каталог назначения, в объект типа File.
JavaExec
Выполняет Java класс который содержит метод main(). task encode(type: JavaExec) {
main = 'org.example.Greeting' args = "Name Surname LastName".split().toList()classpath sourceSets.main.classesDirclasspath configurations.runtime
}
класс с main()
аргументы передаваемые в метод main()
параметры classpath
Gradle & Ant
За счет использования функциональности AntBuilder из Groovy, использование Ant в Gradle проще, чем непосредственно использование Ant. Gradle иногда называют Ant на основе Groovy.Gradle переносит все из пространства имен Ant в свое пространство имен.Для вызова задачи Ant достачно:ant.<имя_задачи>
Gradle & Ant:свойства
Ant свойство:<project>
<property name="appversion" value="1.0"/></project>
Gradle переменная:int appversion = 1.0
Gradle & Ant:пользовтельские задачи
Использование стандартных задача Ant в Gradle решается просто, не намного сложнее использование пользовательских задач.Для этого достаточно использовать taskdef метод из AntiBuilder.task testTask << {
ant.taskdef(name: 'testAntTask', classname: 'org.example.testAntTask', classpath: configurations.testAnt.asPath)
ant.testAntTask(shortFilenames: 'true', failonruleviolation: 'true',rulesetfiles: file('src/tools/basic-rules.xml').toURI().toString()) {
formatter(type: 'text', toConsole: 'true')fileset(dir: 'src/main/java')
}}
Gradle & Ant:комплексные задачи
Пример использования комплексного задания в Ant:<project>
<target name="zipsourceInAnt"><zip destfile='samples-from-ant.zip'>
<fileset dir= 'samples'><include name='**.txt'/>
</fileset></zip>
</target></project>
Gradle & Ant:комплексные задачи
Пример использования комплексного задания в Gradle:task zipsourceInGradle << {
ant.zip(destfile: 'samples-from-gradle.zip') {fileset(dir: 'samples') {
include(name: '**.txt')}
}}
Gradle & Ant:импорт файла сборки
Импорт файла сборки Ant:ant.importBuild 'build.xml'
Gradle & Ant:интеграция
Задачи сборки Ant могут использоваться в качестве dependsOn в Gradle,а задачи сборки Gradle цели могут использоваться как зависимые поля в Ant. Главное условие интеграции Gradle и Ant то, что Gradle должен быть средой выполнения и инициализировать начало сборки.
Gradle & Ant: AntBuilder
Мощь использования Ant в Gradle не ограничена рассмотренными ранее подходами. Использование AntBuilder из Groovy для Ant-заданий дает возможность использовать все парадигмы и конструкции Groovy во время выполнения Ant-заданий.
Gradle & Ant: classpath
Ant classpath:<project>
<!-- Classpath created by Ant, then used by Gradle --><path id="antPathToLibs1" location="antlibs"/><path id="antPathToLibs2" location="antlibs"/>
</project>
Gradle & Ant: classpath
Gradle classpath:ant.importBuild 'build.xml'defaultTasks = ['gradleBuild']repositories {
flatDir name: 'localRepository1', dirs: ant.references['antPathToLibs1']
flatDir name: 'localRepository2', dirs: ant.references.antPathToLibs2
flatDir name: 'localRepository3', dirs: "antlibs"
}
Gradle & Ant: репозитории
Gradle позволяет полчить доступ к Ivy репозиторим. Для этого достаточно задать параметры репозитория в closure под именемrepositories.repositories {
ivy {name = 'ivyRepo'artifactPattern "http://repo.gradleware.org/[organisation]/[module]/[revision]/[artifact]-[revision].[ext]"
}}
Gradle & Maven: plugin: 'java'что делает
Для интеграции Maven и Gradle можно использовать плагин java. Данный плагин подключается следующей строкой:apply plugin: 'java'и выполняет следующие действия:1.скачивает все объявленные зависимости(~/.gradle/cache)2.компилирует код(src/main/java)3.сохраняет скомпилированные классы(build/classes/main)4.пытается скомпилировать и запустить все unit-тесты
Gradle & Maven: plugin: 'java'что делает
5.сохраняет отчет результатов тестов в XML(build/reports/tests/)6.генерирует манифест файл MANIFEST.MF(build/tmp/jar/MANIFEST.MF)7.сохраняет все скомпилированные классы вместе с файлом манифеста в JAR архив(build//maven-gradle-comparison-simple.jar)
Gradle & Maven: plugin: 'java'задачи сборки
1.assemble - собирает все Jar, War, Zip, and Tar архивы2.build - собирает и тестирует текущий проект3.buildDependents - собирает и тестирует текущий проект, а также все проекты которые зависят от него4.buildNeeded - собирает и тестирует текущий проект, а также все проекты от которых он зависит5.classes - собирает main-классы6.clean - удаляет каталог сборки7.jar - cобирает jar-архив содержащий main-классы8.testClasses - cобирает классы для тестов
Gradle & Maven: plugin: 'java'задачи проверки
1.check - выполняет все проверки2.test - выполняет все unit-тесты
Gradle & Maven: plugin: 'java'задачи создания документации
1.javadoc - создает Javadoc API документацию для исходного кода.
Gradle & Maven: свойства
Maven Gradle Default
groupId group blank
artifactId name arhivesBaseName
имя каталога проекта
version version неопределенно
name N/A N/A
description description null
Gradle & Maven: зависимости
Библиотеки объявленные как внешние зависимости описываются в closure с именем dependencies.dependencies {
testCompile group: 'junit', name: 'junit',
version: '4.8.+'compile group: 'commons-beanutils', name: 'commons-beanutils',
version: '1.8.3'}
Gradle & Maven: зависимости
Зависимости возможно добавить в одном из следующих контекстов:1.compile2.default3.testCompile4.testRuntime5.archives6.runtime
Примечание: дополнительно необходимо подключить плагин Groovy: apply plugin: 'groovy'
Gradle & Maven: репозитории
Gradle предоставляет средства для доступа как Ivy, так и Maven репозиториям. Репозитории описываются в closure с именем repositories.repositories {
mavenCentral()}
Примечание:mavenCentral() - предопределенный метод для доступа к центральному репозиторию Maven.
Gradle & Maven: репозитории
Репозиторий можнот подключить по URL.repositories {
mavenRepo(urls:'http://repo.gradle.org/gradle/libs-releases-local')
}
Gradle & Maven: репозитории
В качестве репозитория так же можно использовать каталог.repositories {
add(new FileSystemResolver()) {name = "repo"addArtifactPattern("$rootDir/repo/[organization]/[modul]-
[revision].[ext]")addIvyPattern("$rootDir/repo/[organization]/ivy-[module]-
[revision].xml")checkmodified = true
}}
Gradle & Maven: Multiple Source
В качестве каталога с исходными кодом Gradle использует каталог src/main/java по-умолчанию. Спискок каталогов с исходным кодом может быть легко расширен, для этого используется свойство sourceSets java-плагина.apply plugin: 'java'sourceSets.main.java.srcDirs =
["src/main/java", "srcAdditional/main/java"]
sourceSets.main.java.srcDirs 'srcAdditionalTwo/main/java'
Gradle & Maven: задание по-умолчанию
Maven<build>
<defaultGoal>clean install</defaultGoal></build>
Gradleapply plugin: 'java'defaultTasks = ['clean', 'install']
или
defaultTasks 'clean', 'install'
Gradle & Maven: установка в локальный репозиторий
Для установки артифакта в локальный репозиторий, по анологии с Maven (mvn install), в Gradle достаточно выполнить задание:gradle install
Gradle & Maven: публикация в репозиторий
Для публикации артифакта в локальный репозиторий необходимо подключить maven-плагин и настроить параметры подключения.apply plugin: 'java'apply plugin: 'maven'group = 'com.gradleware.samples'uploadArchives {
repositories.mavenDeployer {repository(url: "file:///gradle/study/maven/mytemprepo/")
}}
Продолжение следует...Больше информации:http://www.gradle.org/