Successfully reported this slideshow.

12 - gradle. evoliutsiia system avtomatychnoi zbirky - sviatoslav babych - it event 2013 (5)

767 views

Published on

12 - Gradle. Еволюція систем автоматичної збірки - Святослав Бабич - IT Event 2013 (5)

Gradle - нова система збірки та інтеграційний засіб нового покоління. У доповіді ми ознайомимося з можливостями цього інструменту, порівняємо його з Ant та Maven, а також розглянемо випадки, у яких мінімальними зусиллями можна перетворити складний і незрозумілий процес складання великого проекту - на просту і прозору процедуру.

Святослав Бабич
http://itevent.if.ua/lecture/gradle-evolyutsiya-sistem-avtomatichnoyi-zbirki-porivnyannya-iz-ant-ta-mavenom

Published in: Education
  • Be the first to comment

12 - gradle. evoliutsiia system avtomatychnoi zbirky - sviatoslav babych - it event 2013 (5)

  1. 1. Еволюція систем автоматичної збірки.Порівняння із Ant’ом та Maven’ом
  2. 2. Зміст1. Що таке Gradle ? Основні можливості .2. Основи скриптової мови (Groovy)3. Управління залежностями та зв’язками4. Збираємо багато проектів одночасно5. Плагіни1. Java2. War, Ear3. Eclipse, Eclipse-wtp6. Робота із система безперервної інтеграції (continuous integration– Jenkins, Hudson)
  3. 3. Що таке Gradle ? Основні можливості.• Гнучкий інструмент для автоматичної збірки (build tool)назразок Ant’у• Поставляється разом із build description language (DSL) на основіGroovy• Як і Maven побудований на принципі - build-by-convention• Дуже гнучкий та легко розширюваний.• Містить вбудовані плагіни для Java, Eclipse, Scala, Groovi, Web,OSGi• Потужна підтримка для збірки багатьох проектів одночасно(multi-project builds)• Керування залежностями (dependency management) побудованана основі Apache Ivy
  4. 4. • Повністю інтегрований із Ant, Maven та Ivy. Підтримує їхструктуру репозиторіїв.• Безкоштовний та з відкритим кодом• Паралельне виконання юніт тестів• Підтримка послідовних збірок (incremental builds)• Динамічні таски та правила для тасків
  5. 5. + гнучкість+ залежність тасків+ контроль над процесом+ різні таски на кожну задачу- важкі build.xml- тяжко підтримувати+ керування залежностями+ плагіни+ збірка багатьох модулів проекту+ угода по конфігурації (convention overconfiguration)- важкі pom.xml- тяжко перевизначитиповедінку по замовчуванні+ DSL , замість XMLлегкість кастомізації
  6. 6. Основи скриптової мови (Groovy)task hello << {println Hello world!}D:@gradlehello.world>gradle hello:helloHello world!BUILD SUCCESSFULДві основні концепції: проекти та таски.Gradle task == Ant targettask intro(dependsOn: hello) << {println "Im Gradle"}1. Hello World2. Залежності між таскамиD:@gradlehello.world>gradle intro:introHello world!Im GradleBUILD SUCCESSFUL
  7. 7. 4.times { counter ->task "task$counter" << {println "Im task number $counter"}}D:@gradlehello.world>gradle task1:task1Im task number 1BUILD SUCCESSFULtask0.dependsOn task2, task33. Динамічні таски4. Маніпулювання таскамиD:@gradlehello.world>gradle task0:task0Im task number 2Im task number 3Im task number 0BUILD SUCCESSFULtask0.doFirst {println ‘before task hook}task0.doLast {println ‘after task hook}D:@gradlehello.world>gradle task0:task0before task hookIm task number 0after task hookBUILD SUCCESSFULtaskGraph
  8. 8. Управління залежностями та зв’язкамиapply plugin: javarepositories {mavenCentral()}dependencies {compile group: org.hibernate, name: hibernate-core, version: 3.6.7.FinaltestCompile group: junit, name: junit, version: 4.+}compile Залежності необхідні на етапі компіляції проекту з сорсівruntime Залежності необхідні для зкомпільованих класів в рантаймі. Такожвключають в себе compile залежностіtestCompile Залежності необхідні для компіляції тест сорсів. Також включають в себеcompile залежності та зкомпільовані класиtestRuntime Залежності необхідні для запуску тестів. Включає compile, compiled classes,testCompile
  9. 9. Репозиторії:• основний Maven,• віддалені Maven / Ivy,• локальні Maven / Ivyrepositories {ivy {url "../local-repo"}maven {url "http://repo.company.com/maven2"}}
  10. 10. Збираємо багато проектів одночасно• Необхідно створити settings.gradle файл у якому вказати які проекти включати.• Можна задати дефолтні налаштування для всіх підпроектів за допомогоюsubprojects {}• Можна задати залежності між проектами. Таким чином можна регулюватипорядок білдання підпроектів.include "shared", "api", "services:webservice", "services:shared"dependencies { compile project(:shared) }subprojects {apply plugin: java‘ apply plugin: eclipse-wtprepositories {mavenCentral()}dependencies {testCompile junit:junit:4.11}}
  11. 11. Плагіни• Додають таски до проекту• Налаштовують додані таски значеннями по-замовчуванню• Додають налаштування залежностей• Додають нові властивості та методи до існуючого типу черезрозширенняjava announce war checkstyle project-reportgroovy application java-library-distribution codenarc signingscala build-announcements ivy-publish eclipse sonarantlr ear maven-publish eclipse-wtpcpp jetty maven2Gradle findbugscpp-exe maven build-dashboard ideacpp-liv osgi pmd jdepend
  12. 12. Java ПлагінcompileJava processResources cleanclasses javadoccompileTestJava processTestResources jartestClassestest uploadArchivescheck assemblebuild
  13. 13. <project name="simple" default="dist" basedir="."><property name="src" location="src/main/java" /><property name="srcTest" location="src/test/java" /><property name="build" location="build" /><property name="dist" location="${build}/lib" /><path id="classpath.test"><pathelement location="libs/junit-4.8.1.jar" /><pathelement location="${srcTest}" /><pathelement location="${build}/classes" /><pathelement location="${build}/test-classes" /></path><target name="init"><mkdir dir="${build}/classes" /><mkdir dir="${build}/test-classes" /></target><target name="compile" depends="init"><javac srcdir="${src}" destdir="${build}/classes" /></target><target name="testCompile" depends="init"><javac srcdir="${srcTest}" destdir="${build}/test-classes"><classpath refid="classpath.test" /></javac></target><target name="test" depends="testCompile"><junit fork="yes" haltonfailure="yes"><batchtest fork="yes"><fileset dir="${srcTest}"><include name="**/*Test.java" /><include name="**/Test*.java" /></fileset></batchtest><classpath refid="classpath.test" /><formatter type="plain"/></junit></target><target name="dist" depends="compile"><mkdir dir="${dist}" /><jar jarfile="${dist}/simple.jar" basedir="${build}/classes" /></target><target name="clean"><delete dir="${build}" /></target></project><?xml version="1.0" encoding="UTF-8"?><project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0http://maven.apache.org/maven-v4_0_0.xsd"><modelVersion>4.0.0</modelVersion><groupId>pl.gradle</groupId><artifactId>simple</artifactId><packaging>jar</packaging><version>1.0-SNAPSHOT</version><dependencies><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.8.1</version><scope>test</scope></dependency></dependencies><build><plugins><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><configuration><source>1.5</source><target>1.5</target></configuration></plugin></plugins></build></project>apply plugin: javaversion = 1.0-SNAPSHOTrepositories {mavenCentral()}dependencies {testCompile junit:junit:4.8.1}javaProject
  14. 14. War, Earclasses assemblewar. earСтруктура проекту:apply plugin: javaversion = 1.0jar {manifest {attributes Implementation-Title: Java Project, Implementation-Version:version}}repositories {mavenCentral()}dependencies {compile group: commons-collections, name: commons-collections, version:3.2testCompile group: junit, name: junit, version: 4.+}test {systemProperties property: value}uploadArchives {repositories {flatDir {dirs repos}}}earWithWar
  15. 15. Eclipse, Eclipse-wtpeclipseProject генерує .project файлeclipseClasspath генерує .classpathфайлeclipseJdt генерує .settings/org.eclipse.jdt.core.prefs файлeclipseWtpComponent генерує .settings/org.eclipse.wst.common.component файлeclipseWtpFacet генерує .settings/org.eclipse.wst.common.project.facet.core.xml файлeclipse генерує всі конфігураційні файлclean, clean… видаляє відповідні файли
  16. 16. Кожен із згенерованих файлів можна модифікувати за допомогою хуків.Процес генерації файлів виглядає наступним чином:1. Читається відповідний файл, або якщо такого файлу не існує товикористовується дефолтовий передбачений Gradle’ом.2. Виконується beforeMerged хук із об’єктом, який представляєвідповідний файл.3. Поточний контент файлу об’єднується із налаштуваннями з білдскрипту або дефолтовими з Gradle’ у4. Виконується whenMerged хук із об’єктом, який представляє вмістрезультуючого файлу5. Виконується withXml хук із XML представленням результуючогофайлу6. Створюється фінальний XML файл
  17. 17. apply plugin: warapply plugin: eclipserepositories {mavenCentral()}dependencies {compile group: commons-collections, name: commons-collections, version: 3.2testCompile group: junit, name: junit, version: 4.+}eclipse.classpath.file {beforeMerged { classpath ->classpath.entries.removeAll { entry -> entry.kind == lib || entry.kind ==var }}whenMerged { classpath ->classpath.entries.findAll { entry -> entry.kind == lib }*.exported = false}}apply plugin: eclipse-wtpeclipse.wtp.facet.file.withXml { provider ->provider.asNode().fixed.find { it.@facet == jst.java }.@facet = jst2.java}eclipse
  18. 18. Дякую за увагуЗапитання ??

×