Gradle

2,890 views

Published on

Short introduction in Gradle build tool.

Published in: Technology
0 Comments
1 Like
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
2,890
On SlideShare
0
From Embeds
0
Number of Embeds
420
Actions
Shares
0
Downloads
35
Comments
0
Likes
1
Embeds 0
No embeds

No notes for slide

Gradle

  1. 1. Gradleilya.lapitan@gmail.com
  2. 2. Установка: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
  3. 3. Жизненный цикл в Gradle:1.Фаза инициализации (Initialization phase) - Gradle решает какиепроекты будут участвовать в сборке.2.Фаза конфигурирования (Configuration phase) - объекты собраныво внутреннюю объектную модель (DAG - directed acyclic graph).testTask { println Config Task;}3.Фаза исполнения (Execution phase) - задачи сборки выполняютсяв порядке разрешения зависимостей.testTask << { println Execute Task}
  4. 4. Жизненный цикл в Gradle:Примечание:весь код описанный как конфигурационный выполняется каждыйраз при запуске файла сборки Gradle, вне зависимости от того,какое задание выполняется
  5. 5. Стандартное задание в Gradle:Каждое задание в Gradle имеет тип,по-умолчанию это типстандартного задания (DefaultTask), на подобии java.lang.Object вJava коде. Стандартное задание на самом деле ничего не делает,а только содержит методы для взаимодейтсвия с объектноймоделью проекта Gradle.Каждое задание в Gradle имеет следующие методы:1.dependsOn(task)2.doFirst(closure) {3.doLast(closure) для обозначения в println hi! Groovy используется4.onlyIf(closure) } термин "closure"
  6. 6. dependsOn(task)Добавляет задание-зависимость для текущего задания.task dependsTask << { println dependsTask} >>gradle testTasktask testTask { :dependsTask dependsOn dependsTask dependsTask} :testTasktestTask << { testTask println testTask}
  7. 7. dependsOn(task)Примечание:задание-зависимость выполняется всегда перед текущимзаданием и должно быть описано перед ним. Задание-зависимость для текущего задания определяется на фазеконфигурирования.
  8. 8. dependsOn(task)Вызвать это метод можно и другими способами:task testTask(dependsOn: dependsTask)testTask.dependsOn dependsTaskdependsOn << dependsTaskdependsOn dependsTasktestTask.dependsOn dependsTask1, dependsTask2task testTask(dependsOn: [dependsTask1, dependsTask2])
  9. 9. doFirst(closure)Добавляет блок выполняемого кода, который будем вызван передначалом выполнения текущего задания.task testTask << { println Task action >>gradle testTask} :testTasktestTask.doFirst{ Task prepare println Task prepare Task action}
  10. 10. doFirst(closure)Данный метод может быть вызван внутри конфигурационногоблока:task testTask { doFirst{ println doFirst method >>gradle testTask } :testTask} doFirst methodtestTask << { Execute testTask println Execute testTask}
  11. 11. doFirst(closure)Примечание:повторные вызовы метода doFirst являются аддативными.Каждый предыдущий вызов исполняемого кода сохраняется, икаждый новый фрагмент исполняемого кода добавляется вначало списка для выполнения.
  12. 12. doFirst(closure)task testTask <<{ println Execute testTask} >>gradle testTasktestTask.doFirst{ :testTask println doFirst definition 1 doFirst definition 2} doFirst definition 1 Execute testTasktestTask.doFirst{ println doFirst definition 2}
  13. 13. doLast(closure)Добавляет блок выполняемого кода, который будем вызван послевыполнения текущего задания.task testTask << { println Task action >>gradle testTask} :testTasktestTask.doLast{ Task action println Task after Task after}
  14. 14. doLast(closure)Примечание:повторные вызовы метода doLast являются аддативными.Каждый предыдущий вызов исполняемого кода сохраняется, икаждый новый фрагмент исполняемого кода добавляется вконец списка для выполнения.
  15. 15. doLast(closure)task testTask <<{ println Execute testTask} >>gradle testTask :testTasktestTask.doLast{ Execute testTask println doLast definition 1 doLast definition 1} doLast definition 2testTask.doLast{ println doLast definition 2}
  16. 16. onlyIf(closure)Позволяет описать предикат оперделяющий условие, когда задачаможет быть выполнена. Значение предиката является значениемисполняемого кода в теле метода onlyIftask testTask << { >>gradle testTask println Execute testTask :testTask SKIPPED}testTask.onlyIf { System.properties[isLoad] == true >>gradle -DisLoad=true testTask} :testTask Execute testTask
  17. 17. onlyIf(closure)Примечание:использование данного метода позволяет переключаться междузаданими в зависимости от определенных условий .Возможность использования Groovy кода позволяет в телеметода onlyIf читать файлы, вызывать веб-сервисы, проверятьучетные записи, выполнять разнообразные операции.
  18. 18. Свойства стандартного задания в Gradle:Стандартное задание Gradle имеет следующие свойства:1.didWork2.enabled3.path4.logger5.logging6.description7.temporaryDir
  19. 19. didWorkЛогическое свойство показывающее успешно ли выполненазадача. Пользователь может самостоятельно установить значениеэтого свойства, для отображения результата сборки кода.Для обозначения успешности своих действий значение данногосвойства могут устанавливать некоторые стандартные задачиGradle, такие как:1.Compile2.Copy3.Delete
  20. 20. enabledЛогическое свойство показывающее возможно ли выполнениетекущего задания. Для запрета выполнения задания значениеданного свойства должно быть false.task testTask << { >>gradle testTask println Execute testTask :testTask} Execute testTasktestTask.enabled = truetask testTask << { println Execute testTask >>gradle testTask :testTask SKIPPED}testTask.enabled = false
  21. 21. pathСтроковое свойство содержащее полный путь к заданию.Значение данного свойства для файлов сборки верхнего уровнясовпадает с именем задания, а для заданий которые расположеныв подзаданиях формируется по следующему правилу::STN:TNSTN (Subtask name) - имя подзаданияTN (Task name) - имя задания в подзадании
  22. 22. loggerСвойство хранящее ссылку на внутренний логгер Gradle. Данныйлоггер реализует интерфейс org.slf4j.Logger с добавлениемнескольких дополнительных уровней логирования.Уровни логгера Gradle:1.DEBUG2.INFO3.LIFECYCLE4.WARN5.QUIET6.ERROR
  23. 23. loggingСвойство представляющее уровень логирования встроенногологгера Gradle. Значение свойства logging.level может бытьпрочитано или записано для смены уровня логгирования присборке.
  24. 24. descriptionСтроковое свойство описывающее цель данного задания.Значение свойства можно задать несколькими способами:task testTask(description: Study Gradle) << { println Test task}task testTask << { println Test task}testTask { description = Study Gradle}
  25. 25. descriptionОдин из способов задания свойства description:task testTask << { println Test task}testTask.description = Study Gradle
  26. 26. temporaryDirСвойство возвращает объект типа File, который указываетвременный каталог для текущего файла сборки.Данный каталог используется для задач нуждающихся вовременном сохранении результатов работы, либо для задачобработки файлов внутри задачи.
  27. 27. Типы заданий в GradleКаждое задание в Gradle имеет тип, кроме стандартного типаDefaultTask, есть типы задач для архивирования, выполненияпрограмм и многого другого. Определение типа задания подобномеханизму наследования в объектно-ориентированных языкахпрограммирования.В число наиболее важных типов заданий входят следующие:1.Copy2.Jar3.JavaExec
  28. 28. CopyДанное задание копирует файлы с одного места в другое.task copyFiles(type: Copy) { откуда from resources куда into target что include **/*.xml, **/*.txt, **/*.properties}Замечание:from, into и include методы наследуются от задания Copy
  29. 29. JarСоздает Jar файл из исходных файлов. Имеет широкиевозможности для конфигурирования.apply plugin: javatask customJar(type: Jar) { manifest { определяем attributes firstKey: firstValue, пользовательские secondKey: secondValue аттрибуты для } файла манифеста archiveName = hello.jar destinationDir = file("${buildDir}/jars") имя архива from sourceSets.main.classes куда сохранить} какие файлы
  30. 30. JarПримечание:задание Jar наследуется от задания Copy. Тип значенияпараметра distinationDir ожидается java.io.File, поэтому впримере используется метод file(), который всегда доступенвнутри файла сборки Gradle. Метод file() переводит строковыйобъект указывающий каталог назначения, в объект типа File.
  31. 31. JavaExecВыполняет Java класс который содержит метод main().task encode(type: JavaExec) { main = org.example.Greeting класс с main() args = "Name Surname LastName".split().toList() classpath sourceSets.main.classesDir classpath configurations.runtime} параметры classpath аргументы передаваемые в метод main()
  32. 32. Gradle & AntЗа счет использования функциональности AntBuilder из Groovy,использование Ant в Gradle проще, чем непосредственноиспользование Ant. Gradle иногда называют Ant на основе Groovy.Gradle переносит все из пространства имен Ant в своепространство имен.Для вызова задачи Ant достачно:ant.<имя_задачи>
  33. 33. Gradle & Ant:свойстваAnt свойство:<project> <property name="appversion" value="1.0"/></project>Gradle переменная:int appversion = 1.0
  34. 34. 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) }}
  35. 35. Gradle & Ant:комплексные задачиПример использования комплексного задания в Ant:<project> <target name="zipsourceInAnt"> <zip destfile=samples-from-ant.zip> <fileset dir= samples> <include name=**.txt/> </fileset> </zip> </target></project>
  36. 36. Gradle & Ant:комплексные задачиПример использования комплексного задания в Gradle:task zipsourceInGradle << { ant.zip(destfile: samples-from-gradle.zip) { fileset(dir: samples) { include(name: **.txt) } }}
  37. 37. Gradle & Ant:импорт файла сборкиИмпорт файла сборки Ant:ant.importBuild build.xml
  38. 38. Gradle & Ant:интеграцияЗадачи сборки Ant могут использоваться в качестве dependsOn вGradle,а задачи сборки Gradle цели могут использоваться какзависимые поля в Ant. Главное условие интеграции Gradle и Antто, что Gradle должен быть средой выполнения иинициализировать начало сборки.
  39. 39. Gradle & Ant: AntBuilderМощь использования Ant в Gradle не ограничена рассмотреннымиранее подходами. Использование AntBuilder из Groovy для Ant-заданий дает возможность использовать все парадигмы иконструкции Groovy во время выполнения Ant-заданий.
  40. 40. Gradle & Ant: classpathAnt classpath:<project> <!-- Classpath created by Ant, then used by Gradle --> <path id="antPathToLibs1" location="antlibs"/> <path id="antPathToLibs2" location="antlibs"/></project>
  41. 41. Gradle & Ant: classpathGradle classpath:ant.importBuild build.xmldefaultTasks = [gradleBuild]repositories { flatDir name: localRepository1, dirs: ant.references[antPathToLibs1] flatDir name: localRepository2, dirs: ant.references.antPathToLibs2 flatDir name: localRepository3, dirs: "antlibs"}
  42. 42. Gradle & Ant: репозиторииGradle позволяет полчить доступ к Ivy репозиторим. Для этогодостаточно задать параметры репозитория в closure под именемrepositories.repositories { ivy { name = ivyRepo artifactPattern "http://repo.gradleware.org/[organisation]/ [module]/ [revision]/[artifact]-[revision].[ext]" }}
  43. 43. Gradle & Maven: plugin: javaчто делаетДля интеграции Maven и Gradle можно использовать плагин java.Данный плагин подключается следующей строкой:apply plugin: javaи выполняет следующие действия:1.скачивает все объявленные зависимости(~/.gradle/cache)2.компилирует код(src/main/java)3.сохраняет скомпилированные классы(build/classes/main)4.пытается скомпилировать и запустить все unit-тесты
  44. 44. 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)
  45. 45. 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обирает классы для тестов
  46. 46. Gradle & Maven: plugin: javaзадачи проверки1.check - выполняет все проверки2.test - выполняет все unit-тесты
  47. 47. Gradle & Maven: plugin: javaзадачи создания документации1.javadoc - создает Javadoc API документацию для исходного кода.
  48. 48. Gradle & Maven: свойства Maven Gradle Default groupId group blank artifactId name имя каталога проекта arhivesBaseName version version неопределенно name N/A N/A description description null
  49. 49. Gradle & Maven: зависимостиБиблиотеки объявленные как внешние зависимости описываются вclosure с именем dependencies.dependencies { testCompile group: junit, name: junit, version: 4.8.+ compile group: commons-beanutils, name: commons-beanutils, version: 1.8.3}
  50. 50. Gradle & Maven: зависимостиЗависимости возможно добавить в одном из следующихконтекстов:1.compile2.default3.testCompile4.testRuntime5.archives6.runtimeПримечание: дополнительно необходимо подключить плагинGroovy: apply plugin: groovy
  51. 51. Gradle & Maven: репозиторииGradle предоставляет средства для доступа как Ivy, так и Mavenрепозиториям. Репозитории описываются в closure с именемrepositories.repositories { mavenCentral()}Примечание:mavenCentral() - предопределенный метод длядоступа к центральному репозиторию Maven.
  52. 52. Gradle & Maven: репозиторииРепозиторий можнот подключить по URL.repositories { mavenRepo(urls: http://repo.gradle.org/gradle/libs-releases-local)}
  53. 53. 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 }}
  54. 54. Gradle & Maven: Multiple SourceВ качестве каталога с исходными кодом Gradle использует каталогsrc/main/java по-умолчанию. Спискок каталогов с исходным кодомможет быть легко расширен, для этого используется свойствоsourceSets java-плагина.apply plugin: javasourceSets.main.java.srcDirs = ["src/main/java", "srcAdditional/main/java"]sourceSets.main.java.srcDirs srcAdditionalTwo/main/java
  55. 55. Gradle & Maven: задание по-умолчаниюMaven<build> <defaultGoal>clean install</defaultGoal></build>Gradleapply plugin: javadefaultTasks = [clean, install]илиdefaultTasks clean, install
  56. 56. Gradle & Maven:установка в локальный репозиторийДля установки артифакта в локальный репозиторий, по анологии сMaven (mvn install), в Gradle достаточно выполнить задание:gradle install
  57. 57. Gradle & Maven:публикация в репозиторийДля публикации артифакта в локальный репозиторий необходимоподключить maven-плагин и настроить параметры подключения.apply plugin: javaapply plugin: mavengroup = com.gradleware.samplesuploadArchives { repositories.mavenDeployer { repository(url: "file:///gradle/study/maven/mytemprepo/") }}
  58. 58. Продолжение следует...Больше информации:http://www.gradle.org/

×