Your SlideShare is downloading. ×
  • Like
Gradle
Upcoming SlideShare
Loading in...5
×

Thanks for flagging this SlideShare!

Oops! An error has occurred.

×

Now you can save presentations on your phone or tablet

Available for both IPhone and Android

Text the download link to your phone

Standard text messaging rates apply

Gradle

  • 1,924 views
Published

Short introduction in Gradle build tool.

Short introduction in Gradle build tool.

Published in Technology
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Be the first to comment
No Downloads

Views

Total Views
1,924
On SlideShare
0
From Embeds
0
Number of Embeds
5

Actions

Shares
Downloads
25
Comments
0
Likes
1

Embeds 0

No embeds

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
    No notes for slide

Transcript

  • 1. Gradleilya.lapitan@gmail.com
  • 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. Жизненный цикл в Gradle:1.Фаза инициализации (Initialization phase) - Gradle решает какиепроекты будут участвовать в сборке.2.Фаза конфигурирования (Configuration phase) - объекты собраныво внутреннюю объектную модель (DAG - directed acyclic graph).testTask { println Config Task;}3.Фаза исполнения (Execution phase) - задачи сборки выполняютсяв порядке разрешения зависимостей.testTask << { println Execute Task}
  • 4. Жизненный цикл в Gradle:Примечание:весь код описанный как конфигурационный выполняется каждыйраз при запуске файла сборки Gradle, вне зависимости от того,какое задание выполняется
  • 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. dependsOn(task)Добавляет задание-зависимость для текущего задания.task dependsTask << { println dependsTask} >>gradle testTasktask testTask { :dependsTask dependsOn dependsTask dependsTask} :testTasktestTask << { testTask println testTask}
  • 7. dependsOn(task)Примечание:задание-зависимость выполняется всегда перед текущимзаданием и должно быть описано перед ним. Задание-зависимость для текущего задания определяется на фазеконфигурирования.
  • 8. dependsOn(task)Вызвать это метод можно и другими способами:task testTask(dependsOn: dependsTask)testTask.dependsOn dependsTaskdependsOn << dependsTaskdependsOn dependsTasktestTask.dependsOn dependsTask1, dependsTask2task testTask(dependsOn: [dependsTask1, dependsTask2])
  • 9. doFirst(closure)Добавляет блок выполняемого кода, который будем вызван передначалом выполнения текущего задания.task testTask << { println Task action >>gradle testTask} :testTasktestTask.doFirst{ Task prepare println Task prepare Task action}
  • 10. doFirst(closure)Данный метод может быть вызван внутри конфигурационногоблока:task testTask { doFirst{ println doFirst method >>gradle testTask } :testTask} doFirst methodtestTask << { Execute testTask println Execute testTask}
  • 11. doFirst(closure)Примечание:повторные вызовы метода doFirst являются аддативными.Каждый предыдущий вызов исполняемого кода сохраняется, икаждый новый фрагмент исполняемого кода добавляется вначало списка для выполнения.
  • 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. doLast(closure)Добавляет блок выполняемого кода, который будем вызван послевыполнения текущего задания.task testTask << { println Task action >>gradle testTask} :testTasktestTask.doLast{ Task action println Task after Task after}
  • 14. doLast(closure)Примечание:повторные вызовы метода doLast являются аддативными.Каждый предыдущий вызов исполняемого кода сохраняется, икаждый новый фрагмент исполняемого кода добавляется вконец списка для выполнения.
  • 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. 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. onlyIf(closure)Примечание:использование данного метода позволяет переключаться междузаданими в зависимости от определенных условий .Возможность использования Groovy кода позволяет в телеметода onlyIf читать файлы, вызывать веб-сервисы, проверятьучетные записи, выполнять разнообразные операции.
  • 18. Свойства стандартного задания в Gradle:Стандартное задание Gradle имеет следующие свойства:1.didWork2.enabled3.path4.logger5.logging6.description7.temporaryDir
  • 19. didWorkЛогическое свойство показывающее успешно ли выполненазадача. Пользователь может самостоятельно установить значениеэтого свойства, для отображения результата сборки кода.Для обозначения успешности своих действий значение данногосвойства могут устанавливать некоторые стандартные задачиGradle, такие как:1.Compile2.Copy3.Delete
  • 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. pathСтроковое свойство содержащее полный путь к заданию.Значение данного свойства для файлов сборки верхнего уровнясовпадает с именем задания, а для заданий которые расположеныв подзаданиях формируется по следующему правилу::STN:TNSTN (Subtask name) - имя подзаданияTN (Task name) - имя задания в подзадании
  • 22. loggerСвойство хранящее ссылку на внутренний логгер Gradle. Данныйлоггер реализует интерфейс org.slf4j.Logger с добавлениемнескольких дополнительных уровней логирования.Уровни логгера Gradle:1.DEBUG2.INFO3.LIFECYCLE4.WARN5.QUIET6.ERROR
  • 23. loggingСвойство представляющее уровень логирования встроенногологгера Gradle. Значение свойства logging.level может бытьпрочитано или записано для смены уровня логгирования присборке.
  • 24. descriptionСтроковое свойство описывающее цель данного задания.Значение свойства можно задать несколькими способами:task testTask(description: Study Gradle) << { println Test task}task testTask << { println Test task}testTask { description = Study Gradle}
  • 25. descriptionОдин из способов задания свойства description:task testTask << { println Test task}testTask.description = Study Gradle
  • 26. temporaryDirСвойство возвращает объект типа File, который указываетвременный каталог для текущего файла сборки.Данный каталог используется для задач нуждающихся вовременном сохранении результатов работы, либо для задачобработки файлов внутри задачи.
  • 27. Типы заданий в GradleКаждое задание в Gradle имеет тип, кроме стандартного типаDefaultTask, есть типы задач для архивирования, выполненияпрограмм и многого другого. Определение типа задания подобномеханизму наследования в объектно-ориентированных языкахпрограммирования.В число наиболее важных типов заданий входят следующие:1.Copy2.Jar3.JavaExec
  • 28. CopyДанное задание копирует файлы с одного места в другое.task copyFiles(type: Copy) { откуда from resources куда into target что include **/*.xml, **/*.txt, **/*.properties}Замечание:from, into и include методы наследуются от задания Copy
  • 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. JarПримечание:задание Jar наследуется от задания Copy. Тип значенияпараметра distinationDir ожидается java.io.File, поэтому впримере используется метод file(), который всегда доступенвнутри файла сборки Gradle. Метод file() переводит строковыйобъект указывающий каталог назначения, в объект типа File.
  • 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. Gradle & AntЗа счет использования функциональности AntBuilder из Groovy,использование Ant в Gradle проще, чем непосредственноиспользование Ant. Gradle иногда называют Ant на основе Groovy.Gradle переносит все из пространства имен Ant в своепространство имен.Для вызова задачи Ant достачно:ant.<имя_задачи>
  • 33. Gradle & Ant:свойстваAnt свойство:<project> <property name="appversion" value="1.0"/></project>Gradle переменная:int appversion = 1.0
  • 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. Gradle & Ant:комплексные задачиПример использования комплексного задания в Ant:<project> <target name="zipsourceInAnt"> <zip destfile=samples-from-ant.zip> <fileset dir= samples> <include name=**.txt/> </fileset> </zip> </target></project>
  • 36. Gradle & Ant:комплексные задачиПример использования комплексного задания в Gradle:task zipsourceInGradle << { ant.zip(destfile: samples-from-gradle.zip) { fileset(dir: samples) { include(name: **.txt) } }}
  • 37. Gradle & Ant:импорт файла сборкиИмпорт файла сборки Ant:ant.importBuild build.xml
  • 38. Gradle & Ant:интеграцияЗадачи сборки Ant могут использоваться в качестве dependsOn вGradle,а задачи сборки Gradle цели могут использоваться какзависимые поля в Ant. Главное условие интеграции Gradle и Antто, что Gradle должен быть средой выполнения иинициализировать начало сборки.
  • 39. Gradle & Ant: AntBuilderМощь использования Ant в Gradle не ограничена рассмотреннымиранее подходами. Использование AntBuilder из Groovy для Ant-заданий дает возможность использовать все парадигмы иконструкции Groovy во время выполнения Ant-заданий.
  • 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. 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. Gradle & Ant: репозиторииGradle позволяет полчить доступ к Ivy репозиторим. Для этогодостаточно задать параметры репозитория в closure под именемrepositories.repositories { ivy { name = ivyRepo artifactPattern "http://repo.gradleware.org/[organisation]/ [module]/ [revision]/[artifact]-[revision].[ext]" }}
  • 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. 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. 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. Gradle & Maven: plugin: javaзадачи проверки1.check - выполняет все проверки2.test - выполняет все unit-тесты
  • 47. Gradle & Maven: plugin: javaзадачи создания документации1.javadoc - создает Javadoc API документацию для исходного кода.
  • 48. Gradle & Maven: свойства Maven Gradle Default groupId group blank artifactId name имя каталога проекта arhivesBaseName version version неопределенно name N/A N/A description description null
  • 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. Gradle & Maven: зависимостиЗависимости возможно добавить в одном из следующихконтекстов:1.compile2.default3.testCompile4.testRuntime5.archives6.runtimeПримечание: дополнительно необходимо подключить плагинGroovy: apply plugin: groovy
  • 51. Gradle & Maven: репозиторииGradle предоставляет средства для доступа как Ivy, так и Mavenрепозиториям. Репозитории описываются в closure с именемrepositories.repositories { mavenCentral()}Примечание:mavenCentral() - предопределенный метод длядоступа к центральному репозиторию Maven.
  • 52. Gradle & Maven: репозиторииРепозиторий можнот подключить по URL.repositories { mavenRepo(urls: http://repo.gradle.org/gradle/libs-releases-local)}
  • 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. 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. Gradle & Maven: задание по-умолчаниюMaven<build> <defaultGoal>clean install</defaultGoal></build>Gradleapply plugin: javadefaultTasks = [clean, install]илиdefaultTasks clean, install
  • 56. Gradle & Maven:установка в локальный репозиторийДля установки артифакта в локальный репозиторий, по анологии сMaven (mvn install), в Gradle достаточно выполнить задание:gradle install
  • 57. Gradle & Maven:публикация в репозиторийДля публикации артифакта в локальный репозиторий необходимоподключить maven-плагин и настроить параметры подключения.apply plugin: javaapply plugin: mavengroup = com.gradleware.samplesuploadArchives { repositories.mavenDeployer { repository(url: "file:///gradle/study/maven/mytemprepo/") }}
  • 58. Продолжение следует...Больше информации:http://www.gradle.org/