Gradle相關(guān)內(nèi)容

form: Gradle學(xué)習(xí)系列

擴(kuò)展task屬性/自定義task屬性

task extTaskDemo {
    //自定義屬性myProperty
    ext.myProperty = "myExtProperty" 
}

task printTaskProperty << {
    println extTaskDemo.myProperty
}

使用DAG(有向非循環(huán)圖)進(jìn)行配置

gradle分** 配置階段 ** 和** 執(zhí)行階段 **,配置階段完成后,gradle就知道所有需要被執(zhí)行的任務(wù)。這樣我們就可以利用這些信息了解哪些任務(wù)被執(zhí)行了。下面的例子來(lái)判斷任務(wù)執(zhí)行完成后,release任務(wù)是否被執(zhí)行

task distribution <<{
        println "We build the zip with version = $version"
}
task release (dependsOn :'distribution')<<{
        println 'We release now'
}
gradle.taskGraph.whenReady {
        taskGraph->
        if(taskGraph.hasTask(release)){ //如果執(zhí)行的任務(wù)包含release任務(wù)
                version = '1.0'
        }else {
                version = '1.0-SNAPSHOT'
        }
}

輸出

gradle -q distribution
We build the zip with version = 1.0-SNAPSHOT

說(shuō)明上面的DAG中不存在release任務(wù),所以release不會(huì)被執(zhí)行。

gradle -q release
We build the zip with version = 1.0We release now

說(shuō)明上面的DAG中存在release任務(wù),說(shuō)明release會(huì)被執(zhí)行。

*上面的代碼中需要注意的一點(diǎn)是whenReady,它會(huì)在(任何一個(gè))任務(wù)執(zhí)行前起作用。 *

執(zhí)行多個(gè)任務(wù)

在命令行下,要想執(zhí)行多個(gè)任務(wù),可以在gradle關(guān)鍵字后面跟多個(gè)任務(wù)名,之間要用** 空格 隔開(kāi),執(zhí)行的順序按照你的輸入的順序執(zhí)行。例如我們要執(zhí)行編譯和測(cè)試的任務(wù)??梢栽诿钚邢螺斎耄?/p>

gradle compile test

依賴(lài)任務(wù)

執(zhí)行任務(wù)的時(shí)候,它的依賴(lài)任務(wù)會(huì)先被執(zhí)行,然后才執(zhí)行該任務(wù),而且被依賴(lài)的任務(wù)只會(huì)被執(zhí)行一次(存在多重依賴(lài)的時(shí)候,也只會(huì)執(zhí)行一次)。


task compile1 <<{
    println 'compiling source'
}

task compileTest1(dependsOn:compile1) <<{
    println 'compiling unit tests'
}
task test1(dependsOn:[compile1,compileTest1])<<{
    println 'running unit tests'
}

task dist1(dependsOn:[compile1,test1])<<{
    println 'build the distribution'
}

看上面的例子,dist1依賴(lài)compile1和test1。然后test1又依賴(lài)compile1和compileTest1。疏導(dǎo)一下關(guān)系

dist1依賴(lài):compile1、compileTest1

test1依賴(lài):compile1、compileTest1

依據(jù)執(zhí)行的順序與命令行的列舉順序有關(guān),且被依賴(lài)的任務(wù)只會(huì)被執(zhí)行一次的這兩個(gè)原則,思考一下輸出應(yīng)該是什么樣子。

gradle -q dist1 test1
compiling source
compiling unit tests
running unit tests
build the distribution

排除任務(wù)

gradle提供了排除某個(gè)特定任務(wù)的語(yǔ)法,不執(zhí)行所依賴(lài)的任務(wù)中的某個(gè)任務(wù),來(lái)看一下命令

gradle task1 -x task2

在執(zhí)行task1任務(wù)時(shí)不執(zhí)行task1所依賴(lài)的task2任務(wù)。而且** 只刪除task2有依賴(lài),而task1沒(méi)有依賴(lài)的任務(wù)(即:刪除task2及其所有依賴(lài)任務(wù),但是不包括task1中有的依賴(lài)任務(wù)) **。
同樣我們來(lái)看看執(zhí)行下面的命令

gradle -q dist1 -x test1
compiling source
build the distribution

分析:執(zhí)行dist1,排除test1任務(wù),所以test1不執(zhí)行,而dist1由于依賴(lài)compile1,所以要先執(zhí)行compile1,然后才執(zhí)行自己。

選擇特定的文件去執(zhí)行

比如我們?nèi)?zhí)行同目錄下sob目錄下的的user.gradle構(gòu)建文件。sob/user.gradle文件內(nèi)容如下

task hello<<{
 println "using build file '$buildFile.name' in '$buildFile.parentFile.name'"
}

執(zhí)行該文件

gradle -q -b sob/user.gradle hello
using build file 'user.gradle' in 'sob'

可以看出要在命令行上用-b 后面跟目錄來(lái)表示指定的文件。任務(wù)在前或在后效果都是一樣的。

gradle -q hello -b sob/user.gradle
using build file 'user.gradle' in 'sob'

自定義變量

你可以在你自己寫(xiě)的腳本中定義本地變量。
運(yùn)用groovy基礎(chǔ)語(yǔ)法,可以使用def定義一個(gè)本地變量。

def dest = "this is myself"
task check<<{
 println dest
}

gradle -q check
this is myself

自定義屬性

ext塊可以一次性添加多個(gè)屬性

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 = "plugin"
    }
}
task printProperties << {
     println springVersion
     println emailNotification
    sourceSets.matching{
    it.purpose=="production"}.each{
    println it.name
    }
}

執(zhí)行該任務(wù)會(huì)打印上面定義的屬性

gradle -q printProperties
3.1.0.RELEASE
build@master.org
main

groovy一些基礎(chǔ)語(yǔ)法

1.setter和getter語(yǔ)法

println project.buildDir
println getProject().getBuildDir()
project.buildDir = 'target'
getProject().setBuildDir('target')
task hello<<{
        println 'Hello world'
        println project.buildDir
}

執(zhí)行g(shù)radle命令

/Users/qianhui/Documents/Developer/gradle_project/0110_1/build/Users/qianhui/Documents/Developer/gradle_project/0110_1/buildHello world/Users/qianhui/Documents/Developer/gradle_project/0110_1/target

2.方法的調(diào)用

方法的調(diào)用可以帶括號(hào)也可以不帶。

test.systemProperty 'some.prop','value'
test.systemProperty('some.prop','value')

用腳本創(chuàng)建目錄

通常情況下,創(chuàng)建目錄使用mkdir來(lái)創(chuàng)建目錄,但是有一種更好的方式來(lái)做到,避免每次都手動(dòng)創(chuàng)建。定義一個(gè)任務(wù)來(lái)創(chuàng)建目錄,然后用dependsOn來(lái)依賴(lài)該任務(wù),這有可以在需要的時(shí)候創(chuàng)建目錄。

def classesDir = new File('build/classes')
task resources << {
        classesDir.mkdirs()
}

task compile(dependsOn:'resources')<<{
        if(classesDir.isDirectory()){
        println 'The class directory exists.I canoperate'
  }
}

執(zhí)行compile任務(wù)

gradle -q compile
The class directory exists.I canoperate

然后就會(huì)在該目錄下生成build/classes目錄

此處的File是時(shí)java.io中的類(lèi)庫(kù),采用java的方式定義腳本或許更加讓java程序員青睞

task makeDir << {
    def File target = new File('target')
    if(!target.exists())
    {
        target.mkdir();
        println 'mkdir done'
    }
    else
    {
        println 'already has dir'
    }
}

在執(zhí)行一個(gè)task后,執(zhí)行另一個(gè)操作

task taskA << {  
    println 'this is task a'    
}
tasks.findByName('taskA').doLast {    
println 'detected taskA has done'
}

gradle -q taskA
this is task a
detected taskA has done

從上面的操作中,可以引申出其他更有用的操作功能,比如,運(yùn)行生成debug_apk后,為其加上系統(tǒng)簽名,可以如下操作:

tasks.findByName('assembleDebug').doLast {    
    println 'apply system signature to apk'
    //TODO::implement the real signature 
}

以后,在每次生成apk時(shí),就會(huì)為其簽上系統(tǒng)簽名

gradle -q assembleDebug

終結(jié)者任務(wù)

在實(shí)際情況中,你可能需要在一個(gè)任務(wù)執(zhí)行之后進(jìn)行一些清理工作,一個(gè)典型的例子就是Web容器在部署應(yīng)用之后要進(jìn)行集成測(cè)試,Gradle提供了一個(gè)finalizer任務(wù)來(lái)實(shí)現(xiàn)這個(gè)功能,你可以用finalizedBy方法來(lái)結(jié)束一個(gè)指定的任務(wù):

 task first << { println "first" }
 task second << { println "second" }
 //聲明first結(jié)束后執(zhí)行second任務(wù)
 first.finalizedBy second

你會(huì)發(fā)現(xiàn)任務(wù)first結(jié)束后自動(dòng)觸發(fā)任務(wù)second:

$ gradle -q first
first
second

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 轉(zhuǎn)載注明出處:http://www.itdecent.cn/p/5255b100930e 0. 前言 完全由個(gè)人翻...
    王三的貓阿德閱讀 2,746評(píng)論 0 4
  • 目前為止,我們已經(jīng)學(xué)習(xí)了如何修改Gradle構(gòu)建屬性,以及如何運(yùn)行任務(wù)。本章,我們會(huì)深入了解這些屬性,并且創(chuàng)建我們...
    sollian閱讀 2,760評(píng)論 0 8
  • Spring Cloud為開(kāi)發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見(jiàn)模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,597評(píng)論 19 139
  • Spring Boot 參考指南 介紹 轉(zhuǎn)載自:https://www.gitbook.com/book/qbgb...
    毛宇鵬閱讀 47,275評(píng)論 6 342
  • 秋風(fēng)不減 初寒將到 我問(wèn)你要去哪里 原來(lái)是我的心里
    麻天喜閱讀 124評(píng)論 0 2

友情鏈接更多精彩內(nèi)容