Gradle學習小記

安裝

環境支持: 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.gradlesettings.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')
}
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • Spring Cloud為開發人員提供了快速構建分布式系統中一些常見模式的工具(例如配置管理,服務發現,斷路器,智...
    卡卡羅2017閱讀 134,991評論 19 139
  • Spring Boot 參考指南 介紹 轉載自:https://www.gitbook.com/book/qbgb...
    毛宇鵬閱讀 46,971評論 6 342
  • 本篇主要是個人學習gradle的筆記總結 一.開始之前 1. 為什么學習Gradle 采用DSL(Doma...
    zyq_neuq閱讀 1,539評論 2 12
  • Android Studio作為Android應用開發的官方IDE,默認使用Gradle作為構建工具,所以對于An...
    feil0n9wan9閱讀 1,702評論 1 6
  • 談到追星,現代年輕人應該一點也不陌生,尤其是90后,95后。追星這一行為,許多父母是不贊同,他們大多認為這太不理智...
    八杯水12138閱讀 454評論 0 0