gradle

58

Upload: ilia-lapitan

Post on 23-Dec-2014

1.907 views

Category:

Technology


0 download

DESCRIPTION

Short introduction in Gradle build tool.

TRANSCRIPT

Page 2: Gradle

Установка: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

Page 3: Gradle

Жизненный цикл в Gradle:1.Фаза инициализации (Initialization phase) - Gradle решает какие проекты будут участвовать в сборке.2.Фаза конфигурирования (Configuration phase) - объекты собраны во внутреннюю объектную модель (DAG - directed acyclic graph).testTask {

println 'Config Task';}3.Фаза исполнения (Execution phase) - задачи сборки выполняются в порядке разрешения зависимостей.testTask << {

println 'Execute Task'}

Page 4: Gradle

Жизненный цикл в Gradle:Примечание: весь код описанный как конфигурационный выполняется каждый раз при запуске файла сборки Gradle, вне зависимости от того, какое задание выполняется

Page 5: 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"

Page 6: Gradle

dependsOn(task)

Добавляет задание-зависимость для текущего задания.

task dependsTask << {println 'dependsTask'

}task testTask {

dependsOn dependsTask}testTask << {

println 'testTask'}

>>gradle testTask:dependsTaskdependsTask:testTasktestTask

Page 7: Gradle

dependsOn(task)

Примечание: задание-зависимость выполняется всегда перед текущим заданием и должно быть описано перед ним. Задание-зависимость для текущего задания определяется на фазе конфигурирования.

Page 8: Gradle

dependsOn(task)

Вызвать это метод можно и другими способами:task testTask(dependsOn: dependsTask)testTask.dependsOn dependsTaskdependsOn << dependsTaskdependsOn 'dependsTask'

testTask.dependsOn dependsTask1, dependsTask2task testTask(dependsOn: [dependsTask1, dependsTask2])

Page 9: Gradle

doFirst(closure)

Добавляет блок выполняемого кода, который будем вызван перед началом выполнения текущего задания.

task testTask << {println 'Task action'

}testTask.doFirst{

println 'Task prepare'}

>>gradle testTask:testTaskTask prepareTask action

Page 10: Gradle

doFirst(closure)

Данный метод может быть вызван внутри конфигурационного блока:task testTask {

doFirst{println 'doFirst method'

}}testTask << {

println 'Execute testTask'}

>>gradle testTask:testTaskdoFirst methodExecute testTask

Page 11: Gradle

doFirst(closure)

Примечание: повторные вызовы метода doFirst являются аддативными. Каждый предыдущий вызов исполняемого кода сохраняется, и каждый новый фрагмент исполняемого кода добавляется в начало списка для выполнения.

Page 12: Gradle

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

Page 13: Gradle

doLast(closure)

Добавляет блок выполняемого кода, который будем вызван после выполнения текущего задания.

task testTask << {println 'Task action'

}testTask.doLast{

println 'Task after'}

>>gradle testTask:testTaskTask actionTask after

Page 14: Gradle

doLast(closure)

Примечание: повторные вызовы метода doLast являются аддативными. Каждый предыдущий вызов исполняемого кода сохраняется, и каждый новый фрагмент исполняемого кода добавляется в конец списка для выполнения.

Page 15: Gradle

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

Page 16: Gradle

onlyIf(closure)

Позволяет описать предикат оперделяющий условие, когда задача может быть выполнена. Значение предиката является значением исполняемого кода в теле метода onlyIf

task testTask << {println 'Execute testTask'

}testTask.onlyIf {

System.properties['isLoad'] == 'true'}

>>gradle -DisLoad=true testTask:testTaskExecute testTask

>>gradle testTask:testTask SKIPPED

Page 17: Gradle

onlyIf(closure)

Примечание: использование данного метода позволяет переключаться между заданими в зависимости от определенных условий . Возможность использования Groovy кода позволяет в теле метода onlyIf читать файлы, вызывать веб-сервисы, проверять учетные записи, выполнять разнообразные операции.

Page 18: Gradle

Свойства стандартного задания в Gradle:Стандартное задание Gradle имеет следующие свойства:1.didWork2.enabled3.path4.logger5.logging6.description7.temporaryDir

Page 19: Gradle

didWork

Логическое свойство показывающее успешно ли выполнена задача. Пользователь может самостоятельно установить значение этого свойства, для отображения результата сборки кода.Для обозначения успешности своих действий значение данного свойства могут устанавливать некоторые стандартные задачи Gradle, такие как:1.Compile2.Copy3.Delete

Page 20: Gradle

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

Page 21: Gradle

path

Строковое свойство содержащее полный путь к заданию. Значение данного свойства для файлов сборки верхнего уровня совпадает с именем задания, а для заданий которые расположены в подзаданиях формируется по следующему правилу::STN:TNSTN (Subtask name) - имя подзаданияTN (Task name) - имя задания в подзадании

Page 22: Gradle

logger

Свойство хранящее ссылку на внутренний логгер Gradle. Данный логгер реализует интерфейс org.slf4j.Logger с добавлением нескольких дополнительных уровней логирования.Уровни логгера Gradle:1.DEBUG2.INFO3.LIFECYCLE4.WARN5.QUIET6.ERROR

Page 23: Gradle

logging

Свойство представляющее уровень логирования встроенного логгера Gradle. Значение свойства logging.level может быть прочитано или записано для смены уровня логгирования при сборке.

Page 24: Gradle

description

Строковое свойство описывающее цель данного задания.Значение свойства можно задать несколькими способами:task testTask(description: 'Study Gradle') << {

println 'Test task'}task testTask << {

println 'Test task'}testTask {

description = 'Study Gradle'}

Page 25: Gradle

description

Один из способов задания свойства description:task testTask << {

println 'Test task'}testTask.description = 'Study Gradle'

Page 26: Gradle

temporaryDir

Свойство возвращает объект типа File, который указывает временный каталог для текущего файла сборки. Данный каталог используется для задач нуждающихся во временном сохранении результатов работы, либо для задач обработки файлов внутри задачи.

Page 27: Gradle

Типы заданий в Gradle

Каждое задание в Gradle имеет тип, кроме стандартного типа DefaultTask, есть типы задач для архивирования, выполнения программ и многого другого. Определение типа задания подобно механизму наследования в объектно-ориентированных языках программирования.В число наиболее важных типов заданий входят следующие:1.Copy2.Jar3.JavaExec

Page 28: Gradle

Copy

Данное задание копирует файлы с одного места в другое.task copyFiles(type: Copy) {

from 'resources'into 'target'include '**/*.xml', '**/*.txt', '**/*.properties'

}

Замечание:from, into и include методы наследуются от задания Copy

откудакудачто

Page 29: Gradle

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

}

определяем пользовательскиеаттрибуты для файла манифеста

имя архивакуда сохранитькакие файлы

Page 30: Gradle

Jar

Примечание: задание Jar наследуется от задания Copy. Тип значения параметра distinationDir ожидается java.io.File, поэтому в примере используется метод file(), который всегда доступен внутри файла сборки Gradle. Метод file() переводит строковый объект указывающий каталог назначения, в объект типа File.

Page 31: Gradle

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

Page 32: Gradle

Gradle & Ant

За счет использования функциональности AntBuilder из Groovy, использование Ant в Gradle проще, чем непосредственно использование Ant. Gradle иногда называют Ant на основе Groovy.Gradle переносит все из пространства имен Ant в свое пространство имен.Для вызова задачи Ant достачно:ant.<имя_задачи>

Page 33: Gradle

Gradle & Ant:свойства

Ant свойство:<project>

<property name="appversion" value="1.0"/></project>

Gradle переменная:int appversion = 1.0

Page 34: Gradle

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')

}}

Page 35: Gradle

Gradle & Ant:комплексные задачи

Пример использования комплексного задания в Ant:<project>

<target name="zipsourceInAnt"><zip destfile='samples-from-ant.zip'>

<fileset dir= 'samples'><include name='**.txt'/>

</fileset></zip>

</target></project>

Page 36: Gradle

Gradle & Ant:комплексные задачи

Пример использования комплексного задания в Gradle:task zipsourceInGradle << {

ant.zip(destfile: 'samples-from-gradle.zip') {fileset(dir: 'samples') {

include(name: '**.txt')}

}}

Page 37: Gradle

Gradle & Ant:импорт файла сборки

Импорт файла сборки Ant:ant.importBuild 'build.xml'

Page 38: Gradle

Gradle & Ant:интеграция

Задачи сборки Ant могут использоваться в качестве dependsOn в Gradle,а задачи сборки Gradle цели могут использоваться как зависимые поля в Ant. Главное условие интеграции Gradle и Ant то, что Gradle должен быть средой выполнения и инициализировать начало сборки.

Page 39: Gradle

Gradle & Ant: AntBuilder

Мощь использования Ant в Gradle не ограничена рассмотренными ранее подходами. Использование AntBuilder из Groovy для Ant-заданий дает возможность использовать все парадигмы и конструкции Groovy во время выполнения Ant-заданий.

Page 40: Gradle

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>

Page 41: Gradle

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"

}

Page 42: Gradle

Gradle & Ant: репозитории

Gradle позволяет полчить доступ к Ivy репозиторим. Для этого достаточно задать параметры репозитория в closure под именемrepositories.repositories {

ivy {name = 'ivyRepo'artifactPattern "http://repo.gradleware.org/[organisation]/[module]/[revision]/[artifact]-[revision].[ext]"

}}

Page 43: Gradle

Gradle & Maven: plugin: 'java'что делает

Для интеграции Maven и Gradle можно использовать плагин java. Данный плагин подключается следующей строкой:apply plugin: 'java'и выполняет следующие действия:1.скачивает все объявленные зависимости(~/.gradle/cache)2.компилирует код(src/main/java)3.сохраняет скомпилированные классы(build/classes/main)4.пытается скомпилировать и запустить все unit-тесты

Page 44: Gradle

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)

Page 45: Gradle

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обирает классы для тестов

Page 46: Gradle

Gradle & Maven: plugin: 'java'задачи проверки

1.check - выполняет все проверки2.test - выполняет все unit-тесты

Page 47: Gradle

Gradle & Maven: plugin: 'java'задачи создания документации

1.javadoc - создает Javadoc API документацию для исходного кода.

Page 48: Gradle

Gradle & Maven: свойства

Maven Gradle Default

groupId group blank

artifactId name arhivesBaseName

имя каталога проекта

version version неопределенно

name N/A N/A

description description null

Page 49: Gradle

Gradle & Maven: зависимости

Библиотеки объявленные как внешние зависимости описываются в closure с именем dependencies.dependencies {

testCompile group: 'junit', name: 'junit',

version: '4.8.+'compile group: 'commons-beanutils', name: 'commons-beanutils',

version: '1.8.3'}

Page 50: Gradle

Gradle & Maven: зависимости

Зависимости возможно добавить в одном из следующих контекстов:1.compile2.default3.testCompile4.testRuntime5.archives6.runtime

Примечание: дополнительно необходимо подключить плагин Groovy: apply plugin: 'groovy'

Page 51: Gradle

Gradle & Maven: репозитории

Gradle предоставляет средства для доступа как Ivy, так и Maven репозиториям. Репозитории описываются в closure с именем repositories.repositories {

mavenCentral()}

Примечание:mavenCentral() - предопределенный метод для доступа к центральному репозиторию Maven.

Page 52: Gradle

Gradle & Maven: репозитории

Репозиторий можнот подключить по URL.repositories {

mavenRepo(urls:'http://repo.gradle.org/gradle/libs-releases-local')

}

Page 53: Gradle

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

}}

Page 54: Gradle

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'

Page 55: Gradle

Gradle & Maven: задание по-умолчанию

Maven<build>

<defaultGoal>clean install</defaultGoal></build>

Gradleapply plugin: 'java'defaultTasks = ['clean', 'install']

или

defaultTasks 'clean', 'install'

Page 56: Gradle

Gradle & Maven: установка в локальный репозиторий

Для установки артифакта в локальный репозиторий, по анологии с Maven (mvn install), в Gradle достаточно выполнить задание:gradle install

Page 57: Gradle

Gradle & Maven: публикация в репозиторий

Для публикации артифакта в локальный репозиторий необходимо подключить maven-плагин и настроить параметры подключения.apply plugin: 'java'apply plugin: 'maven'group = 'com.gradleware.samples'uploadArchives {

repositories.mavenDeployer {repository(url: "file:///gradle/study/maven/mytemprepo/")

}}

Page 58: Gradle

Продолжение следует...Больше информации:http://www.gradle.org/