Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Gradle - Java y Android

Gradle - Java y Android

Charla sobre Gradle en Granada, España durante el evento de Betabeers Granada de Marzo de 2015

Juan Ramón González

March 26, 2015
Tweet

More Decks by Juan Ramón González

Other Decks in Programming

Transcript

  1. Gradle: Java y Android Juan Ramón González González Quadbits SL

    http://www.quadbits.com David Lázaro Esparcia Obsso - En trueque actualmente https://speakerdeck.com/jrgonzalez/gradle-java-y-android
  2. En episodios anteriores... • Ant (2000) with Ivy (2004) ◦

    Basado en XML ◦ Similar a Make en muchos aspectos ◦ XML, al ser de naturaleza jerárquica no encaja demasiado bien con la estructura procedural que usa Ant ◦ Hay que escribir todos los comandos de cada tarea a realizar 1 / 262
  3. En episodios anteriores... • Maven (2002) ◦ Creado para solucionar

    algunos de los problemas de Ant ◦ Aún basado en XML ◦ Sustituye la especificación completa de tareas de Ant por algunas convenciones y metas invocables ◦ La personalización de las metas es complicada
  4. • Groucho Marx: “Un niño de cinco años podría entenderlo.

    ¡Que me traigan un niño de cinco años!” • Coge las mejores características de Ant y Maven y construye sobre ellas usando un DSL • DSL basado en Groovy (lenguaje de JVM) • Mucho más claro de leer y más sencillo • Usa convenciones, pero permite flexibilidad Gradle (2012)
  5. Ejemplo básico (Versión Ant) Tomado de: http://technologyconversations.com/2014/06/18/build-tools/ [ivy.xml] <ivy-module version="2.0">

    <info organisation="org.apache" module="java-build-tools"/> <dependencies> <dependency org="junit" name="junit" rev="4.11"/> <dependency org="org.hamcrest" name="hamcrest-all" rev="1.3"/> </dependencies> </ivy-module>
  6. Ejemplo básico (Versión Ant) [build.xml 1/3] <project xmlns:ivy="antlib:org.apache.ivy.ant" name="java-build-tools" default="

    jar"> <property name="src.dir" value="src"/> <property name="build.dir" value="build"/> <property name="classes.dir" value="${build.dir}/classes"/> <property name="jar.dir" value="${build.dir}/jar"/> <property name="lib.dir" value="lib" /> <path id="lib.path.id"> <fileset dir="${lib.dir}" /> </path> …
  7. Ejemplo básico (Versión Ant) [build.xml 2/3] … <target name="resolve"> <ivy:retrieve

    /> </target> <target name="clean"> <delete dir="${build.dir}"/> </target> …
  8. Ejemplo básico (Versión Ant) [build.xml 3/3] … <target name="compile" depends="resolve">

    <mkdir dir="${classes.dir}"/> <javac srcdir="${src.dir}" destdir="${classes.dir}" classpathref="lib. path.id"/> </target> <target name="jar" depends="compile"> <mkdir dir="${jar.dir}"/> <jar destfile="${jar.dir}/${ant.project.name}.jar" basedir="${classes. dir}"/> </target> </project>
  9. Ejemplo básico (Versión Maven) [pom.xml 1/3] <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.0

    http://maven. apache.org/maven-v4_0_0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.technologyconversations</groupId> <artifactId>java-build-tools</artifactId> <packaging>jar</packaging> <version>1.0</version> …
  10. Ejemplo básico (Versión Maven) [pom.xml 2/3] … <dependencies> <dependency> <groupId>junit</groupId>

    <artifactId>junit</artifactId> <version>4.11</version> </dependency> <dependency> <groupId>org.hamcrest</groupId> <artifactId>hamcrest-all</artifactId> <version>1.3</version> </dependency> </dependencies>…
  11. Ejemplo básico (Versión Maven) [pom.xml 3/3] … <build> <plugins> <plugin>

    <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>2.3.2</version> </plugin> </plugins> </build> </project>
  12. Ejemplo básico (Versión Gradle) apply plugin: 'java' apply plugin: 'checkstyle'

    // Quality checks - coding standard apply plugin: 'findbugs' // Quality checks - static analysis to look for bugs apply plugin: 'pmd' // Quality checks - common programming flaws version = '1.0' repositories { mavenCentral() } dependencies { testCompile group: 'junit', name: 'junit', version: '4.11' testCompile group: 'org.hamcrest', name: 'hamcrest-all', version: '1.3' }
  13. ❏ project/ ❏ module1 ❏ build.gradle (opcional) ❏ module2 ❏

    build.gradle (opcional) ❏ build.gradle ❏ settings.gradle (opcional) Gradle - Estructura
  14. • Código principal: …/src/main/java • Código de test: …/src/test/java •

    Recursos de android …/src/[main/test/…]/res Gradle - Convenciones principales
  15. task hello << { println '...world!' } > gradle -q

    hello ...world! Declaración de tareas task taskX(dependsOn: 'taskY') << { println 'taskX' } task taskY << { println 'taskY' } > gradle -q taskX taskY taskX
  16. • Gradle plugins • Custom plugins • Ejemplo: apply plugin:

    'checkstyle' apply plugin: 'java' Añade tasks: clean, build, compileTestJava, jar, javadoc • Referencia: http://plugins.gradle.org/ Plugins
  17. apply plugin: 'java' repositories { mavenCentral() } dependencies { compile

    'org.hibernate:hibernate-core:3.6.7.Final' testCompile group: 'junit', name: 'junit', version: '4.+' compile files('libs/gson-2.2.4.jar') } • Buscador de librerías http://gradleplease.appspot.com/ Gestión de Dependencias
  18. [variables.gradle] → Reusable, fácil de mantener project.ext.constants = [ //

    Groovy map literal versions: [ // Versions for dependencies, plugins and tools junit: ‘4.12’, licensesdialog: ‘1.6.0’, ], ] project.ext.libraries = [ // Groovy map literal junit: 'junit:junit:' + constants.versions.junit, licensesdialog: dependencies.create('de.psdev.licensesdialog:licensesdialog:' + constants.versions.licensesdialog + '@aar') { exclude module: 'support-v4' }, ] Gestión de Dependencias
  19. [build.gradle] buildscript { … apply from: new File(rootDir, 'variables.gradle') }

    subprojects { … dependencies { compile libraries.licensesdialog testcompile libraries.junit } … } Gestión de Dependencias
  20. apply plugin: 'com.android.application' General Tasks assemble The task to assemble

    the output(s) of the project check The task to run all the checks. build This task does both assemble and check clean This task cleans the output of the project Android plugin android { compileSdkVersion 22 buildToolsVersion "22.0.1" defaultConfig { versionCode 200 versionName "0.0.2" minSdkVersion 16 targetSdkVersion 22 } }
  21. android { buildTypes { debug { applicationIdSuffix ".debug" } release

    { minifyEnabled true proguardFile getDefaultProguardFile('proguard-android.txt') } } } Android plugin - Build types
  22. android { ... productFlavors { flavor1 { packageName "com.example.flavor1" versionCode

    20 } flavor2 { packageName "com.example.flavor2" minSdkVersion 14 } } } Android plugin - Flavors
  23. src/ ❏ main/ ❏ java/ ❏ res/ ❏ freeApp/ ❏

    java/ ❏ res/ ❏ paidApp/ ❏ java/ ❏ res/ ❏ beta/ ❏ java/ ❏ res/ Android plugin - Flavors android { ... productFlavors { freeApp { applicationId "com.mybillionairecompany.app. free" } paidApp { applicationId "com.mybillionairecompany.app. paid" } beta { applicationId "com.mybillionairecompany.app. beta" } } }
  24. Android plugin - Bonus • Construir flavor / buildType específico

    ◦ gradle assembleFreeAppRelease -> Construye el buildType ‘release’ del flavor ‘freeApp’ ◦ gradle assembleBetaDebug -> Contruye el buildType ‘debug’ del flavor ‘beta’ • Publicar en maven central: ◦ https://github.com/bintray/gradle-bintray-plugin ◦ https://github.com/chrisbanes/gradle-mvn-push • Testing: ◦ http://tools.android.com/tech-docs/unit-testing-support ◦ https://github.com/robolectric/robolectric-gradle-plugin • ¡Para los más intrépidos!: ◦ DSL: https://developer.android.com/tools/building/plugin-for-gradle.html ◦ Groovy: http://groovy-lang.org/documentation.html ◦ Gradle book: http://www2.gradleware.com/ebook
  25. iOS - Alternativa a cocoapods • Build iOS and Mac

    projects • Override sign settings for iOS builds • Perform unit tests • Support for multiple Xcodes (on one machine) • Cocoapods support • Appledoc support • Code coverage support (using gcovr ) • Hockeykit, HockeyApp, DeployGate , Apple TestFlight • Sparkle Link: https://github.com/openbakery/gradle-xcodePlugin ¿Sólo Java y Android?