Gradle in 45min

  • View
    1.151

  • Download
    2

Embed Size (px)

Text of Gradle in 45min

  • GRADLE IN 45MINSchalk Cronj

  • ABOUT ME

    Email:

    Twitter / Ello : @ysb33r

    ysb33r@gmail.com

    Gradle plugins authored/contributed to: VFS, Asciidoctor,JRuby family (base, jar, war etc.), GnuMake, Doxygen

  • GET YOUR DAILY GRADLE DOSE

    @DailyGradle

    #gradleTip

  • GRADLEA next generation build-and-deploy

    pipeline tool

  • MOST TRIVIAL JAVA PROJECT

    apply plugin: 'java'

    Will look for sources under src/main/java

  • JAVA PROJECT

    repositories { jcenter() }

    apply plugin : 'java'

    dependencies { testCompile 'junit:junit:4.1' }

  • GRADLE DEPENDENCYMANAGEMENT

    Easy to use

    Flexible to configure for exceptions

    Uses dependencies closure

    First word on line is usually name of a configuration.

    Configurations are usually supplied by plugins.

    Dependencies are downloaded from repositories

    Maven coordinates are used as format

  • GRADLE REPOSITORIES

    Specified within a repositories closure

    Processed in listed order to look for dependencies

    jcenter() preferred open-source repo.

    mavenLocal(), mavenCentral(), maven {}

    Ivy repositories via ivy {}

    Flat-directory repositories via flatDir

  • GRADLE REPOSITORIES

    repositories { jcenter() mavenCentral() maven { url "https://plugins.gradle.org/m2/" } }

    repositories { ivy { url 'file://path/to/repo' layout 'pattern', { artifact '[module]/[revision]/[artifact](.[ext])' ivy '[module]/[revision]/ivy.xml' } } }

  • GRADLE DSLUnderlying language is Groovy

    You dont need to be a Groovy expert to be a Gradle poweruser

    Groovy doesnt need ; in most cases

    Groovy does more with less punctuation, making it anideal choice for a DSL

    In most cases lines that do not end on an operator isconsidered a completed statement.

  • GROOVY VS JAVA

    In Groovy:

    All class members are public by default

    No need to create getters/setters for public fields

    Both static & dynamic typing supported

    def means Object

  • CALLING METHODSclass Foo { void bar( def a,def b ) {} }

    def foo = new Foo()

    foo.bar( '123',456 ) foo.bar '123', 456

    foo.with { bar '123', 456 }

  • CALLING METHODS WITH CLOSURESclass Foo { void bar( def a,Closure b ) {} }

    def foo = new Foo()

    foo.bar( '123',{ println it } )

    foo.bar ('123') { println it }

    foo.bar '123', { println it }

  • MAPS IN GROOVY

    Hashmaps in Groovy are simple to use

    def myMap = [ plugin : 'java' ]

    Maps are easy to pass inline to functions

    project.apply( plugin : 'java' )

    Which in Gradle can become

    apply plugin : 'java'

  • LISTS IN GROOVY

    Lists in Groovy are simple too

    def myList = [ 'clone', ''http://github.com/ysb33r/GradleLectures' ]

    This makes it possible for Gradle to do

    args 'clone', 'http://github.com/ysb33r/GradleLectures'

  • CLOSURE DELEGATION IN GROOVY

    When a symbol cannot be resolved within a closure,Groovy will look elsewhere

    In Groovy speak this is called a Delegate.

    This can be programmatically controlled via theClosure.delegate property.

  • CLOSURE DELEGATION IN GROOVY

    class Foo { def target }

    class Bar { Foo foo = new Foo() void doSomething( Closure c ) { c.delegate = foo c() } }

    Bar bar = new Bar() bar.doSomething { target = 10 }

  • MORE CLOSURE MAGIC

    If a Groovy class has a method 'call(Closure)`, the object canbe passed a closure directly.

    class Foo { def call( Closure c) { /* ... */ } }

    Foo foo = new Foo() foo {

    println 'Hello, world'

    }

    // This avoids ugly syntax foo.call({ println 'Hello, world' })

  • CLOSURE DELEGATION IN GRADLE

    In most cases the delegation will be entity the closure ispassed to.

    Will also look at the Project and ext objects.

    The Closure.delegate property allows plugin writersability to create beautiful DSLs

    task runSomething(type : Exec ) { cmdline 'git' }

    is roughly the equivalent ofExecTask runSomething = new ExecTask() runSomething.cmdline( 'git' )

  • GRADLE TASKSCan be based upon a task type

    task runSomething ( type : Exec ) {

    command 'git'

    args 'clone', 'https://bitbucket.com/ysb33r/GradleWorkshop'

    }

    Can be free-formtask hellowWorld

  • GRADLE TASKS : CONFIGURATION VS

    ACTION

    Use of

  • BUILDSCRIPTThe buildscript closure is special

    It tells Gradle what to load into the classpath beforeevaluating the script itself.

    It also tells it where to look for those dependencies.

    Even though Gradle 2.1 has added a new way of addingexternal plugins, buildscript are much more flexible.

  • EXTENSIONS

    Extensions are global configuration blocks added byplugins.

    Example: The jruby-gradle-base plugin will add ajruby block.

    apply plugin: 'com.github.jruby-gradle.base'

    jruby { defaultVersion = '1.7.11' }

  • GRADLE COMMAND-LINE

    gradle -v gradle -h gradle tasks gradle tasks --info

  • GRADLE WRAPPERUse wrapper where possible:

    Eliminates need to install Gradle in order to build project

    Leads to more reproducible builds

    gradle wrapper --wrapper-version 2.12

    ./gradlew tasks

  • EXECUTING TASKS./gradlew ...

    ./gradlew build

  • DEPENDENCIESExamine dependencies involved with various configurations

    ./gradlew dependencies

  • SUPPORT FOR OTHER JVMLANGUAGES

  • GROOVY PROJECT

    repositories { jcenter() }

    apply plugin : 'groovy'

    dependencies { compile 'org.codehaus.groovy:groovy-all:2.4.3'

    testCompile ('org.spockframework:spock-core:1.0-groovy-2.4') { exclude module : 'groovy-all' } }

  • SCALA PROJECT

    repositories { jcenter() }

    apply plugin : 'scala'

    dependencies { compile 'org.scala-lang:scala-library:2.11.8' }

  • BUILDING KOTLIN

    plugins { id "com.zoltu.kotlin" version "1.0.1" }

    dependencies { compile "org.jetbrains.kotlin:kotlin-stdlib:1.0.1-1"

    }

  • RUNNING JRUBYplugins {

    id 'com.github.jruby-gradle.base' version '1.2.1'

    }

    import com.github.jrubygradle.JRubyExec

    dependencies {

    jrubyExec "rubygems:colorize:0.7.7"

    }

    task printSomePrettyOutputPlease(type: JRubyExec) {

    description "Execute our nice local print-script.rb"

    script "${projectDir}/print-script.rb"

    }

    (Example from JRuby-Gradle project)

  • OTHER LANGUAGESC++ / C / ASM / Resources (built-in)

    Clojure (plugin)

    Frege (plugin)

    Golang (plugin)

    Gosu (plugin)

    Mirah (plugin in progress)

  • SUPPORT FOR OTHERBUILDSYSTEMS

    ANT (built-in)

    GNU Make

    MSBuild / xBuild

    Grunt, Gulp

    Anything else craable via Exec or JavaExec task

  • BUILDING DOCUMENTATION

    Javadoc, Groovydoc, Scaladoc (built-in)

    Doxygen (C, C++) (plugin)

    Markdown (plugin)

    Asciidoctor (plugin)

  • BUILDING WITH ASCIIDOCTORplugins { id 'org.asciidoctor.convert' version '1.5.2' }

  • BUILDING WITH ASCIIDOCTORrepositories { jcenter() }

    asciidoctor { sources { include 'example.adoc' }

    backends 'html5'

    }

  • PUBLISHING

    Built-in to Maven, Ivy

    Metadata publishing for native projects still lacking

    Various plugins for AWS and other cloud storage

    Plain old copies to FTP, SFTP etc.

  • MORE SUPPORT

    Official buildsystem for Android

    Docker

    Hadoop

  • TOUR DE FORCE

    Build a distributable application packaged as as ZIP

    Runnable via shell script or batch file

    Contains classes written Java, Groovy & Kotlin source

    Test source code with Spock Framework

  • TOUR DE FORCE

    plugins { id 'java' id 'groovy' id 'com.zoltu.kotlin' version '1.0.1' id 'application' }

    repositories { jcenter() }

    dependencies { compile 'org.codehaus.groovy:groovy-all:2.4.3' compile 'org.jetbrains.kotlin:kotlin-stdlib:1.0.1-1' testCompile 'org.spockframework:spock-core:1.0-groovy-2.4' }

    version = '1.0' mainClassName = "gradle.workshop.HelloJava"

    compileGroovy.dependsOn compileKotlin

  • ENDGAMEGradle is breaking new ground

    Ever improving native support

    Continuous performance improvements

    Go find some more plugins at https://plugins.gradle.org

  • ABOUT THIS PRESENTATIONWritten in Asciidoctor

    Styled by asciidoctor-revealjs extension

    Built using:

    Gradle

    gradle-asciidoctor-plugin

    gradle-vfs-plugin

    Code snippets tested as part of build

    Source code:https://github.com/ysb33r/GradleLectures/tree/MkJugMar2016

  • THANK YOU

    Email:

    Twitter / Ello : @ysb33r

    #idiomaticgradle

    ysb33r@gmail.com

    https://leanpub.com/idiomaticgradle

  • MIGRATIONS

  • ANT TO GRADLE

    Reflect Ant Build into Gradleant.importBuild('build.xml')

  • MAVEN TO GRADLE

    Go to directory where pom.xml is and typegradle init --type pom

  • USEFUL STUFF

  • PUBLISHING VIA VFS

    plugins { id "org.ysb33r.vfs" version "1.0-beta3" }

    task publishToWebserver