Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Introduction to Gradle
Search
Gasol Wu
September 15, 2012
Programming
2
260
Introduction to Gradle
Gasol Wu
September 15, 2012
Tweet
Share
More Decks by Gasol Wu
See All by Gasol Wu
Behat - BDD for PHP
gasol
3
970
Buffering Requirement for Lossless Vertical handoffs in Wireless Overlay Networks
gasol
0
24
Other Decks in Programming
See All in Programming
型付き API リクエストを実現するいくつかの手法とその選択 / Typed API Request
euxn23
8
2.3k
ECS Service Connectのこれまでのアップデートと今後のRoadmapを見てみる
tkikuc
2
260
Macとオーディオ再生 2024/11/02
yusukeito
0
380
Amazon Qを使ってIaCを触ろう!
maruto
0
420
cmp.Or に感動した
otakakot
3
210
Jakarta EE meets AI
ivargrimstad
0
260
Laravel や Symfony で手っ取り早く OpenAPI のドキュメントを作成する
azuki
2
120
ペアーズにおけるAmazon Bedrockを⽤いた障害対応⽀援 ⽣成AIツールの導⼊事例 @ 20241115配信AWSウェビナー登壇
fukubaka0825
6
2k
デザインパターンで理解するLLMエージェントの作り方 / How to develop an LLM agent using agentic design patterns
rkaga
3
230
macOS でできる リアルタイム動画像処理
biacco42
9
2.4k
Outline View in SwiftUI
1024jp
1
340
Contemporary Test Cases
maaretp
0
140
Featured
See All Featured
Product Roadmaps are Hard
iamctodd
PRO
49
11k
The Language of Interfaces
destraynor
154
24k
GitHub's CSS Performance
jonrohan
1030
460k
Navigating Team Friction
lara
183
14k
RailsConf 2023
tenderlove
29
900
Teambox: Starting and Learning
jrom
133
8.8k
How to train your dragon (web standard)
notwaldorf
88
5.7k
RailsConf & Balkan Ruby 2019: The Past, Present, and Future of Rails at GitHub
eileencodes
131
33k
The Illustrated Children's Guide to Kubernetes
chrisshort
48
48k
Designing Experiences People Love
moore
138
23k
How GitHub (no longer) Works
holman
310
140k
Why Our Code Smells
bkeepers
PRO
334
57k
Transcript
Introduction to Gradle Gasol Wu 2012/9/15
Who am I • Work at KKBOX • http://github.com/Gasol •
Twitter @gasolwu
Build System History 3 2 +
The Problem is ... <XML/>!
<?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
Size Comparison Size Comparison Size Comparison chars lines Ant 1733
102 Maven 2 904 31 Gradle 224 17
• Quite verbose • Expressiveness of XML is limited •
It’s hard to trace
So, What We Really Want?
• Easy to customize and extend • Abstraction and structuring
A Better Way To Build!
Gradle • Ease of migration • Declarative builds and build-by-convention
• Rich DSL based on Groovy • Leverage both Ant and Maven • Gradle Wrapper
Gradle is Groovy Groovy is Java
// build.gradle System.out.println(“Java Way”); 4.times { print it }
> 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
Task task myTask task myTask { configure closure } task
myType << { task action } task myTask(type: SomeType) task myTask(type: SomeType) { configure closure}
Hello World // build.gradle task hello { doLast { println
‘Hello World!’ } } > gradle -q hello Hello World!
A shortcut task definition task hello << { println ‘Hello
World!’ }
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
Groovy in Gradle’s tasks task count << { 4.times {
print “$it “ } } > gradle -q count 0 1 2 3
Task dependencies task hello << { println ‘Hello World’ }
task intro(dependsOn: hello) << { println “I’m Gradle” } > gradle -q intro Hello World! I’m Gradle
Lazy dependsOn task X(dependsOn: ‘Y’) << { println ‘X’ }
task Y << { println ‘Y’ } > gradle -q X Y X
Dynamic tasks 4.times { counter -> task “task$counter” << {
println “I’m task number $counter” } } > gradle -q task1 I’m task number 1
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!
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' } }
Build Phases • Initialization • Configuration • The build scripts
of all projects which are part of the build are executed. • Execution
Build phases (cont.) // settings.gradle println ‘initialization phase’ // build.gradle
println ‘configuration phase’ task configured { println ‘configuration phase’ } task test << { println ‘execution phase’ }
Build phases (output) > gradle test initialization phase initialization phase
execution phase :test BUILD SUCCESSFUL Total time: 1 secs
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 }
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
A basic Java project apply plugin: ‘java’
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’ } } }
> gradle build :compileJava :processResources :classes :jar :assemble :compileTestJava :processTestResources
:testClasses :test :check :build BUILD SUCCESSFUL Total time: 1 secs
External Dependencies repositories { mavenCetral() } dependencies { compile group:
‘common-collections’, name: ‘common- collections’, version: ‘3.2’ testCompile ‘junit:junit:4.+’ }
More dependencies dependencies { compile project(':shared') compile files('libs/a.jar', 'libs/b.jar') runtime
fileTree(dir: 'libs', include: '*.jar') compile gradleApi() groovy localGroovy() }
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' } } }
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') } }
> 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
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
Multi-Project? http://gradle.org/docs/current/userguide/ multi_project_builds.html
Demo • gradle-android-plugin • Writing my own plugin • git://github.com/Gasol/intro-to-gradle.git
Links • http://gradle.org/docs/current/userguide/ userguide.html • https://speakerdeck.com/u/bmuschko/p/ next-generation-builds-with-gradle-1
http://gradleware.com/registered/books/building-and-testing/
Thanks :)
Question?