安裝
環境支持: java1.7+
自動安裝
brew install gradle
手動安裝
參考官網
構建腳本的基本
簡單嘗試
build.gradle
task hello{
doLast{
println 'Hello world!'
}
}
$./gradlew -q hello
Hello world
- -q : 安靜模式,不輸出日志
快捷方式寫法
task hello << {
println 'Hello world'
}
$./gradlew -q hello
Hello world
<< 是doLast的別名
簡單groovy語法
變量
task hello << {
String h = 'hello world!'
println h.toUpperCase()
}
$./gradlew -q hello
HELLO WORLD
循環
task hello << {
4.times {print "$it"}
}
$./gradlew -q hello
0123
"$it"是雙引號,表示當前計數器的值
依賴
task getGF << {
println 'I have a girlfriend'
}
task getWife(dependsOn: getGF) << {
println 'I have a wife'
}
$./gradlew -q getWife
I have a girlfriend
I have a wife
被添加的依賴可以不存在
動態task
4.times { counter ->
task "task$counter" << {
println "I'm task number $counter"
}
}
./gradlew -q task1
I'm task number 1
./gradlew -q task2
I'm task number 2
動態依賴
主要任務存在,就能被添加
4.times { counter ->
task "task$counter" << {
println "I'm task number $counter"
}
}
task0.dependsOn task1,task2,task3
./gradlew -q task0
I'm task number 1
I'm task number 2
I'm task number 3
I'm task number 0
行為添加
task hello << {
println 'Hello'
}
hello.doLast {
println 'Hello last'
}
hello.doFirst {
println 'Hello first'
}
hello << {
println 'Hello again'
}
./gradlew -q hello
Hello first
Hello
Hello last
Hello again
額外的task屬性
task task1 {
ext.username = 'sb'
}
task task2 << {
println task1.username
println 'i am task2'
}
ext設置額外屬性,只要代碼執行到賦值屬性,那么其他后面的task都能引用
檢查運行的任務
task distribution << {
println "We build the version:$version"
}
task release(dependsOn:distribution){
println "We release now"
}
gradle.taskGraph.whenReady{ t->
if(t.hasTask(release)){
version = '1.0'
}else{
version = '1.0-SNAPSHOT'
}
}
./gradle -q distribution
We release now
We build the version:1.0-SNAPSHOT
./gradle -q release
We release now
We build the version:1.0
構建Java項目
使用Java插件
apply plugin: 'java'
構建項目
Java插件內置許多任務
> gradle build
:compileJava
:processResources
:classes
:jar
:assemble
:compileTestJava
:processTestResources
:testClasses
:test
:check
:build
BUILD SUCCESSFUL
Total time: 1 secs
一些有用的任務
- clean : 刪除 build 目錄,移除所有構建的文件
- assemble : 編譯打包代碼,但不運行單元測試。其他插件帶給這個 task 更多特性,比如如果你使用 War 插件,task 將給 project 構建 WAR 文件
- check : 編譯測試你的代碼。其他插件帶給這個 task 提供更多檢查類型。比如,你使用 checkstyle 插件, 這個 task 建輝在你的代碼中 執行 Checkstyle
外部依賴
Java的一些依賴,引用時則需要同步倉庫.
添加倉庫
repositories {
mavenCentral()
}
添加依賴
dependencies {
compile group: 'commons-collections', name: 'commons-collections', version: '3.2'
testCompile group: 'junit', name: 'junit', version: '4.+'
}
自定義項目
sourceCompatibility = 1.5
version = '1.0'
jar {
manifest {
attributes 'Implementation-Title': 'Gradle Quickstart','Implementation- Version': version
}
}
設置project的屬性
test {
systemProperties 'property': 'value'
}
執行
gradle properties
可以列出project的屬性,你可以看到 Java 插件添加的屬性和他們的默認值*
發布Jar文件
Jar文件可以發布到本地和遠程倉庫
uploadArchives {
repositories {
flatDir {
dirs 'repos'
}
}
}
創建eclipse項目
apply plugin: 'eclipse'
多項目構建
multiproject/
api/
services/webservice/
shared/
services/shared/
settings.gradle
include "shared", "api", "services:webservice", "services:shared"
配置注入
subprojects {
apply plugin: 'java'
apply plugin: 'eclipse-wtp'
repositories {
mavenCentral()
}
dependencies {
testCompile 'junit:junit:4.11'
}
version = '1.0'
jar {
manifest.attributes provider: 'gradle'
}
}
項目間的依賴
dependencies {
compile project(':shared')
}
創建發布包
api/build.gradle
task dist(type: Zip) {
dependsOn spiJar
from 'src/dist'
into('libs') {
from spiJar.archivePath
from configurations.runtime
}
}
artifacts {
archives dist
}
項目配置
Java標準配置
- compile : 編譯項目的生產源所需的依賴。
- runtime : 生產類在運行時所需的依賴。默認情況下,還包括編譯時的依賴。
- testCompile : 編譯項目的測試源所需的依賴。默認情況下,還包括產品編譯類和編譯時的依賴。
- testRuntime : 運行測試所需的依賴。默認情況下,還包括 編譯,運行時和測試編譯的依賴。
Groovy插件
使用 Groovy 插件來構建 Groovy 項目。這個插件繼承自 Java 插件,使你的應用具備了編譯能力。
使用插件
apply plugin: 'groovy'
Java插件同時被應用到項目
示例
apply plugin: 'eclipse'
apply plugin: 'groovy'
repositories {
mavenCentral()
}
dependencies {
compile 'org.codehaus.groovy:groovy-all:2.3.6'
testCompile 'junit:junit:4.11'
}
./gradle build
:compileJava UP-TO-DATE
:compileGroovy UP-TO-DATE
:processResources UP-TO-DATE
:classes UP-TO-DATE
:jar
:assemble
:compileTestJava UP-TO-DATE
:compileTestGroovy UP-TO-DATE
:processTestResources UP-TO-DATE
:testClasses UP-TO-DATE
:test UP-TO-DATE
:check UP-TO-DATE
:build
BUILD SUCCESSFUL
Total time: 1.161 secs
Gradle命令行
task compile << {
println 'compiling source'
}
task compileTest(dependsOn: compile) << {
println 'compiling unit tests'
}
task test(dependsOn: [compile, compileTest]) << {
println 'running unit tests'
}
task dist(dependsOn: [compile, test]) << {
println 'building the distribution'
}
執行順序
gradle dist test
:compile
compiling source
:compileTest
compiling unit tests
:test
running unit tests
:dist
building the distribution
BUILD SUCCESSFUL
Total time: 1 secs
每個task執行一次,所以gradle test dist和gradle dist test一樣
排除task
gradle dist -x test
:compile
compiling source
:dist
building the distribution
BUILD SUCCESSFUL
Total time: 1 secs
使用-x排除task執行
發生故障處理
默認情況task失敗->gradle停止
,使用--continue
參數可以繼續構建,但是失敗task所依賴的task都不會執行
任務名稱縮寫
當運行任務時,指定任務時只要前綴
能唯一識別任務名稱即可,支持駝峰寫法
指定gradle文件
默認從工作目錄尋找build.gradle
和settings.gradle
里尋找子項目,可以使用-b
選項指定gradle文件.
指定多項目
-p
參數代替-b
獲取構建信息
項目列表
projects
任務列表
tasks
詳細信息
--all
task細節
./gradle help --task build
:help
Detailed task information for build
Path
:build
Type
Task (org.gradle.api.Task)
Description
Assembles and tests this project.
Group
build
BUILD SUCCESSFUL
依賴列表
- 所有依賴 :
dependencies
- 指定項目 :
dependencies api:dependencies
使用特定配置
gradle -q api:dependencies --configuration testCompile
查看特定依賴
./gradle dependencyInsight --dependency groovy
:dependencyInsight
org.codehaus.groovy:groovy-all:2.3.6
\--- compile
BUILD SUCCESSFUL
Total time: 0.919 secs
項目屬性
./gradle properties
查看執行順序
gradle -m clean compile
編寫構建腳本
- 在構建腳本中,你所調用的任何一個方法,如果在構建腳本中未定義,它將被委托給 Project 對象。
- 在構建腳本中,你所訪問的任何一個屬性,如果在構建腳本里未定義,它也會被委托給 Project 對象。
標準屬性
名稱 | 類型 | 說明 |
---|---|---|
project | Project | The Project實例 |
name | String | 項目目錄的名稱 |
path | String | 項目的絕對路徑 |
description | String | 項目的描述 |
projectDir | File | 包含生成腳本的目錄 |
buildDir | File | projectDir/build |
group | Object | 未指定 |
version | Object | 未指定 |
ant | AntBuilder | An AntBuilder實例 |
腳本API
當 Gradle 執行一個腳本時,它將腳本編譯為一個實現了 Script 接口的類。這意味著所有由該 Script 接口聲明的屬性和方法在您的腳本中是可用的。
聲明變量
有兩類可以在生成腳本中聲明的變量: 局部變量和額外屬性。
局部變量
局部變量是用 def 關鍵字聲明的。它們只在定義它們的范圍內可以被訪問。局部變量是 Groovy 語言底層的一個特征。
額外屬性
Gradle 的域模型中,所有增強的對象都可以容納用戶定義的額外的屬性。這包括但并不限于 project、task 和源碼集。額外的屬性可以通過所屬對象的 ext 屬性進行添加,讀取和設置。或者,可以使用 ext塊同時添加多個屬性。
apply plugin: "java"
ext {
springVersion = "3.1.0.RELEASE"
emailNotification = "build@master.org"
}
sourceSets.all { ext.purpose = null }
sourceSets {
main {
purpose = "production"
}
test {
purpose = "test"
}
plugin {
purpose = "production"
}
}
task printProperties << {
println springVersion
println emailNotification
sourceSets.matching { it.purpose == "production" }.each { println it.name }
}
一些 Groovy 的基礎
Groovy JDK
Groovy 對 Java 的標準類增加了很多有用的方法。例如, Iterable 新增的each方法,會對Iterable 的元素進行遍歷:
configurations.runtime.each { File f -> println f }
屬性訪問器
Groovy 會自動地把一個屬性的引用轉換為對適當的 getter 或 setter 方法的調用。
// Using a getter method
println project.buildDir
println getProject().getBuildDir()
// Using a setter method
project.buildDir = 'target'
getProject().setBuildDir('target')
括號可選的方法調用
調用方法時括號是可選的。
test.systemProperty 'some.prop', 'value'
test.systemProperty('some.prop', 'value')
集合
Groovy 提供了一些定義 List 和 Map 實例的快捷寫法。兩種類型都是簡單的 literal,但 map literal 有一些有趣的曲折。
// List literal
test.includes = ['org/gradle/api/**', 'org/gradle/internal/**']
List<String> list = new ArrayList<String>()
list.add('org/gradle/api/**')
list.add('org/gradle/internal/**')
test.includes = list
// Map literal.
Map<String, String> map = [key1:'value1', key2: 'value2']
作為方法最后一個參數的閉包
repositories {
println "in a closure"
}
repositories() { println "in a closure" }
repositories({ println "in a closure" })
閉包委托
每個閉包都有一個委托對象,Groovy 使用它來查找變量和方法的引用,而不是作為閉包的局部變量或參數。Gradle 在配置閉包中使用到它,把委托對象設置為被配置的對象。
dependencies {
assert delegate == project.dependencies
testCompile('junit:junit:4.11')
delegate.testCompile('junit:junit:4.11')
}