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

Introduction to Gradle

Avatar for Gasol Wu Gasol Wu
September 15, 2012

Introduction to Gradle

Avatar for Gasol Wu

Gasol Wu

September 15, 2012
Tweet

More Decks by Gasol Wu

Other Decks in Programming

Transcript

  1. <?xml version="1.0"?> <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"/> <property name="version" value="1.0-SNAPSHOT" /> <path id="classpath.compile"> <pathelement location="libs/commons-lang-2.5.jar"/> </path> <path id="classpath.test"> <pathelement location="libs/junit-4.8.2.jar"/> <pathelement location="libs/commons-lang-2.5.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"> <classpath refid="classpath.compile"/> </javac> </target> <target name="testCompile" depends="compile"> <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"/> </fileset> </batchtest> <classpath refid="classpath.test"/> <formatter type="plain"/> </junit> </target> <target name="dist" depends="test"> <mkdir dir="${dist}"/> <jar jarfile="${dist}/coc-comparison-${version}.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.0 http://maven.apache.org/maven-v4_0_0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>grId</groupId> <artifactId>coc-comparison</artifactId> <packaging>jar</packaging> <version>1.0-SNAPSHOT</version> <dependencies> <dependency> <groupId>commons-lang</groupId> <artifactId>commons-lang</artifactId> <version>2.5</version> </dependency> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.8.1</version> <scope>test</scope> </dependency> </dependencies> <properties> <maven.compiler.target>1.6</maven.compiler.target> <maven.compiler.source>1.6</maven.compiler.source> </properties> </project> apply plugin: 'java' version="1.0-SNAPSHOT" group="grId" archivesBaseName="coc-comparison" repositories { mavenCentral() } dependencies { compile 'commons-lang:commons-lang:2.5' testCompile 'junit:junit:4.8.1' } 2 http://kaczanowscy.pl/tomek/2010-11/build-script-length-maven3-polyglot-maven-gradle-ant
  2. Gradle • Ease of migration • Declarative builds and build-by-convention

    • Rich DSL based on Groovy • Leverage both Ant and Maven • Gradle Wrapper
  3. > gradle Java Way 0 1 2 3 :help Welcome

    to Gradle 1.2. To run a build, run gradle <task> ... To see a list of available tasks, run gradle tasks To see a list of command-line options, run gradle --help BUILD SUCCESSFUL Total time: 2.454 secs
  4. Task task myTask task myTask { configure closure } task

    myType << { task action } task myTask(type: SomeType) task myTask(type: SomeType) { configure closure}
  5. Hello World // build.gradle task hello { doLast { println

    ‘Hello World!’ } } > gradle -q hello Hello World!
  6. Build scripts are code task upper << { String someString

    = ‘mY_nAmE’ println “Original: $someString“ println “Upper: “ + someString.toUpperCase() } > gradle -q upper Original: mY_nAmE Upper: MY_NAME
  7. Groovy in Gradle’s tasks task count << { 4.times {

    print “$it “ } } > gradle -q count 0 1 2 3
  8. Task dependencies task hello << { println ‘Hello World’ }

    task intro(dependsOn: hello) << { println “I’m Gradle” } > gradle -q intro Hello World! I’m Gradle
  9. Lazy dependsOn task X(dependsOn: ‘Y’) << { println ‘X’ }

    task Y << { println ‘Y’ } > gradle -q X Y X
  10. Dynamic tasks 4.times { counter -> task “task$counter” << {

    println “I’m task number $counter” } } > gradle -q task1 I’m task number 1
  11. Default tasks defaultTasks ‘clean’, ‘run’ task clean << { println

    ‘Default Cleaning!’ } task run << { println ‘Default Running!’ } task other << { println “I’m not a default task!” } > gradle -q Default Cleaning! Default Running!
  12. Configure by DAG task distribution << { println "We build

    the zip with version=$version" } task release(dependsOn: 'distribution') << { println 'We release now' } gradle.taskGraph.whenReady { if (it.hasTask(release)) { version = '1.0' } else { version = '1.0-SNAPSHOT' } }
  13. Build Phases • Initialization • Configuration • The build scripts

    of all projects which are part of the build are executed. • Execution
  14. Build phases (cont.) // settings.gradle println ‘initialization phase’ // build.gradle

    println ‘configuration phase’ task configured { println ‘configuration phase’ } task test << { println ‘execution phase’ }
  15. Build phases (output) > gradle test initialization phase initialization phase

    execution phase :test BUILD SUCCESSFUL Total time: 1 secs
  16. Ant are first class citizens // build.xml <project> <property name=”gradleName”

    value=”Gradle”/> <target name=”helloFromAnt”> <echo message=”Hello Ant!”/> </target> </project> // build.gradle ant.importBuild ‘build.xml’ task hello(dependsOn: helloFromAnt) << { println ‘Hello ‘ + ant.gradleName }
  17. Ant are first class citizens (cont.) > gradle tasks --all

    /* skip */ Other tasks ---------- hello helloFromAnt > gradle hello :helloFromAnt [ant:echo] Hello Ant! :hello Hello Gradle BUILD SUCCESSFUL Total time: 2.015 secs
  18. Directory Structure By Default . ├── build.gradle └── src ├──

    main │ ├── java │ └── resources └── test ├── java └── resources sourceSets { main { java { srcDir ‘src/main/java’ } resources { srcDir ‘src/main/resources’ } } test { java { srcDir ‘src/test/java’ } resources { srcDir ‘src/test/resources’ } } }
  19. External Dependencies repositories { mavenCetral() } dependencies { compile group:

    ‘common-collections’, name: ‘common- collections’, version: ‘3.2’ testCompile ‘junit:junit:4.+’ }
  20. More dependencies dependencies { compile project(':shared') compile files('libs/a.jar', 'libs/b.jar') runtime

    fileTree(dir: 'libs', include: '*.jar') compile gradleApi() groovy localGroovy() }
  21. More repositories repositories { mavenCentral() mavenLocal() maven { url "http://repo.mycompany.com/maven2"

    } ivy { url "http://repo.mycompany.com/maven2" layout "maven" credentials { username 'user' password 'password' } } }
  22. Customising Project apply plugin: 'java' apply plugin: 'maven' apply plugin:

    'eclipse' sourceCompatibility = 1.5 version = '1.0' jar { manifest { attributes 'Implementation-Title': 'Gradle Quickstart', 'Implementation-Version': version } } repositories { mavenCentral() } dependencies { compile 'commons-collections:commons-collections:3.2' testCompile 'junit:junit:4.+' } uploadArchives { repositories.mavenDeployer { repository(url: 'file://localhost/tmp/repo') } }
  23. > tree -C /tmp/repo/ /tmp/repo/ └── quickstart └── quickstart ├──

    1.0 │ ├── quickstart-1.0.jar │ ├── quickstart-1.0.jar.md5 │ ├── quickstart-1.0.jar.sha1 │ ├── quickstart-1.0.pom │ ├── quickstart-1.0.pom.md5 │ └── quickstart-1.0.pom.sha1 ├── maven-metadata.xml ├── maven-metadata.xml.md5 └── maven-metadata.xml.sha1 3 directories, 9 files
  24. Standard Gradle Plugins • java, groovy, scala, antlr, cpp*, cpp-exe*,

    cpp-lib* • announce, application, ear, jetty, maven, osgi, war, maven2Gradle • checkstyle, codearc, eclipse, ecilpse-wtp, findbugs, idea, jdepend, pmd, project-report, signing, sonar