說明
這是一個基於 JVM 的富有突破性構建工具。
它爲您提供了:
- 一個像 ant 一樣,通用的靈活的構建工具
- 一種可切換的,像 maven 一樣的基於約定約定優於配置的構建框架
- 強大的多工程構建支持
- 強大的依賴管理(基於 ApacheIvy)
- 對已有的 maven 和 ivy 倉庫的全面支持
- 支持傳遞性依賴管理,而不需要遠程倉庫或者 pom.xml 或者 ivy 配置文件
- ant 式的任務和構建是 gradle 的第一公民
- 基於 groovy,其 build 腳本使用 groovy dsl 編寫
- 具有廣泛的領域模型支持你的構建
安裝
先決條件
Gradle在所有主要操作系統上運行,只需要安裝Java JDK或JRE 7或更高版本。要檢查,請運行java -version
環境變量配置
運行 gradle 必須將 GRADLE_HOME/bin 加入到你的 PATH 環境變量中
測試安裝
運行如下命令來檢查是否安裝成功.該命令會顯示當前的 JVM 版本和 Gradle 版本。
gradle -v
JVM參數配置
Gradle 運行時的 JVM 參數可以通過 GRADLE_OPTS 或 JAVA_OPTS 來設置.這些參數將會同時生效。 JAVA_OPTS 設置的參數將會同其它 JAVA 應用共享,一個典型的例子是可以在 JAVA_OPTS 中設置代理和 GRADLE_OPTS 設置內存參數。同時這些參數也可以在 gradle 或者 gradlew 腳本文件的開頭進行設置
HelloWord
Gradle中的所有內容都基於兩個基本概念:Projects和tasks.
每個Gradle構建都由一個或多個項目組成。項目代表什麼取決於您使用Gradle做什麼。例如,項目可能表示庫JAR或Web應用程序。它可能代表由其他項目生成的JAR組裝的分發ZIP。項目不一定代表要構建的東西。它可能代表着要做的事情,例如將應用程序部署到登臺或生產環境。如果現在看起來有點模糊,請不要擔心。Gradle的逐個構建支持爲項目的內容添加了更具體的定義。每個項目由一個或多個任務組成。任務代表構建執行的一些原子工作。這可能是編譯某些類,創建JAR,生成Javadoc或將一些存檔發佈到存儲庫。
使用gradle
命令運行Gradle構建。gradle
命令查找build.gradle
當前目錄中調用的文件。我們稱這個build.gradle
文件爲構建腳本,但嚴格來說它是一個構建配置腳本。
創建以下名爲的構建腳本build.gradle
。
task hello {
doLast {
println 'Hello world!'
}
}
在命令行shell中,移動到包含目錄並使用以下命令執行構建腳本gradle -q hello
//--------------------
// 任務依賴
//命令 gradle -q intro
//輸出 Hello world!
// I'm Gradle
//--------------------
task hello {
doLast {
println 'Hello world!'
}
}
task intro {
dependsOn hello
doLast {
println "I'm Gradle"
}
}
//--------------------
// 任務依賴-依賴任務在執行任務之後聲明
//命令 gradle -q taskX
//輸出 taskY
// taskX
//--------------------
task taskX {
dependsOn 'taskY'
doLast {
println 'taskX'
}
}
task taskY {
doLast {
println 'taskY'
}
}
//--------------------
// 動態任務
//命令 gradle -q task1
//輸出 I'm task number 1
//--------------------
4.times { counter ->
task "task$counter" {
doLast {
println "I'm task number $counter"
}
}
}
//--------------------
// 操作現有任務-創建任務後,可以通過API訪問它們。可以使用它在運行時動態地向任務添加依賴項。Ant不允許這樣的事情
//命令 gradle -q task0
//輸出
// I'm task number 2
// I'm task number 3
// I'm task number 0
//--------------------
4.times { counter ->
task "task$counter" {
doLast {
println "I'm task number $counter"
}
}
}
task0.dependsOn task2, task3
//--------------------
// 操作現有任務-添加行爲
//命令 gradle -q hello
//輸出
// Hello Venus
// Hello Earth
// Hello Mars
// Hello Jupiter
//--------------------
task hello {
doLast {
println 'Hello Earth'
}
}
hello.doFirst {
println 'Hello Venus'
}
hello.configure {
doLast {
println 'Hello Mars'
}
}
hello.configure {
doLast {
println 'Hello Jupiter'
}
}
//--------------------
// Groovy DSL快捷方式表示法
//有一種方便的表示法來訪問現有任務。每個任務都可以作爲構建腳本的屬性使用:
//命令 gradle -q hello
//輸出
// Hello world!
// Greetings from the hello task.
//--------------------
task hello {
doLast {
println 'Hello world!'
}
}
hello.doLast {
println "Greetings from the $hello.name task."
}
//--------------------
//額外的任務屬性
//可以將自己的屬性添加到任務中。要添加名爲的屬性myProperty,請設置ext.myProperty爲初始值。從那時起,可以像預定義的任務屬性一樣讀取和設置屬性。
//命令 gradle -q printTaskProperties
//輸出
// myValue
//
//--------------------
task myTask {
ext.myProperty = "myValue"
}
task printTaskProperties {
doLast {
println myTask.myProperty
}
}
//--------------------
//默認任務
//Gradle允許您定義在未指定其他任務時執行的一個或多個默認任務
//命令 gradle -q
//輸出
// Default Cleaning!
// Default Running!
//
//--------------------
defaultTasks 'clean', 'run'
task clean {
doLast {
println 'Default Cleaning!'
}
}
task run {
doLast {
println 'Default Running!'
}
}
task other {
doLast {
println "I'm not a default task!"
}
}
//--------------------
//依賴任務的不同輸出
//Gradle具有配置階段和執行階段。在配置階段之後,Gradle知道應該執行的所有任務。Gradle爲您提供了一個利用這些信息的鉤子。這樣的用例是檢查釋放任務是否是要執行的任務之一。根據此情況,您可以爲某些變量分配不同的值。
//在以下示例中,執行distribution和release任務會導致version變量的值不同。
//命令 gradle -q distribution
//輸出 We build the zip with version=1.0-SNAPSHOT
//命令 gradle -q release
//輸出
// We build the zip with version=1.0
// We release now
//--------------------
task distribution {
doLast {
println "We build the zip with version=$version"
}
}
task release {
dependsOn 'distribution'
doLast {
println 'We release now'
}
}
gradle.taskGraph.whenReady { taskGraph ->
if (taskGraph.hasTask(":release")) {
version = '1.0'
} else {
version = '1.0-SNAPSHOT'
}
}
//--------------------
//構建腳本的外部依賴項
//如果構建腳本需要使用外部庫,則可以將它們添加到構建腳本本身的腳本類路徑中。您可以使用該buildscript()方法執行此操作,並傳入一個聲明構建腳本類路徑的塊。
//對於多項目構建,使用項目buildscript()方法聲明的依賴項可用於其所有子項目的構建腳本
//命令 gradle -q encode
//輸出 aGVsbG8gd29ybGQK
//--------------------
import org.apache.commons.codec.binary.Base64
buildscript {
repositories {
mavenCentral()
}
dependencies {
classpath group: 'commons-codec', name: 'commons-codec', version: '1.2'
}
}
task encode {
doLast {
def byte[] encodedString = new Base64().encode('hello world\n'.getBytes())
println new String(encodedString)
}
}
//--------------------
//使用方法
//Gradle可以擴展您如何組織構建邏輯。爲上面的示例組織構建邏輯的第一個級別是提取方法。
//對於多項目構建,使用項目buildscript()方法聲明的依賴項可用於其所有子項目的構建腳本
//命令 gradle -q loadfile
// I'm fond of build.gradle
// I'm fond of build2.gradle
// I'm fond of gradle.properties
// I'm fond of java_pid39256.hprof
//--------------------
task checksum {
doLast {
fileList('../../').each { File file ->
ant.checksum(file: file, property: "cs_$file.name")
println "$file.name Checksum: ${ant.properties["cs_$file.name"]}"
}
}
}
task loadfile {
doLast {
fileList('../Downloads').each { File file ->
ant.loadfile(srcFile: file, property: file.name)
println "I'm fond of $file.name"
}
}
}
File[] fileList(String dir) {
file(dir).listFiles({file -> file.isFile() } as FileFilter).sort()
}