Upload
schalk-cronje
View
1.182
Download
3
Embed Size (px)
Citation preview
ABOUT ME
Email:
Twitter / Ello : @ysb33r
Gradle plugins authored/contributed to: VFS, Asciidoctor,JRuby family (base, jar, war etc.), GnuMake, Doxygen
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 don’t need to be a Groovy expert to be a Gradle poweruser
Groovy doesn’t 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 << {
println 'Hello, world'
}
GRADLE TASKS : CONFIGURATION VS
ACTION
Use of << {} adds action to be executed
Tasks supplied by plugin will have default actions
Use of {} configures a task
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 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
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 cra�able via Exec or JavaExec task
BUILDING DOCUMENTATION
Javadoc, Groovydoc, Scaladoc (built-in)
Doxygen (C, C++) (plugin)
Markdown (plugin)
Asciidoctor (plugin)
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.
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
https://leanpub.com/idiomaticgradle