Gradle基礎(chǔ)知識(1)

安裝Gradle

  1. 確保安裝你的電腦了Java7或以上版本
  2. 在這里下載最新的Gradle distribution
  3. 創(chuàng)建一個文件夾,把下載的壓縮包解壓進去(以C:\Gradle為例)猾漫,然后進入文件夾中的bin目錄汁政,復(fù)制路徑(C:\Gradle\gradle-4.3.1\bin)批狐,把路徑加入到系統(tǒng)環(huán)境變量的Path
  4. 命令行輸入gradle -v滨彻,顯示Gradle版本即安裝完成

注:官方指南

Groovy基礎(chǔ)知識

Groovy簡介

Groovy是一種基于JVM的敏捷開發(fā)語言术徊,他可以和Java進行混寫本刽,同時Groovy在配置信息上又比Java要靈活,他具有閉包和動態(tài)語言中的其他特性赠涮。

正題

在Groovy中子寓,你可以這樣打印一句話,跟Java很像有木有

println "Hello Groovy!"

Groovy與Java混寫笋除,這樣是沒問題的

//Java
class JavaGreeter {
    public void sayHello() {
        System.out.println("Hello Java!");
    }
}
//Groovy
def greeter = new JavaGreeter()
greeter.sayHello()

Groovy只在運行時檢查類型斜友,也就是說我們不需要申明變量的類型,并且可以中途改變類型

def foo = 6.5//這里foo是一個浮點數(shù)
foo = "a string"http://這里foo變?yōu)橐粋€字符串

Groovy中字符串的拼接和Kotlin中的很像

println "foo has value: $foo"http://$后加變量名
println "Let's do some math. 5 + 6 = ${5 + 6}"http://${表達式}

Groovy的函數(shù)不需要申明參數(shù)類型垃它,也不需要寫return鲜屏,寫在函數(shù)里的最后一個表達式就是返回值

def doubleIt(n) {
   n + n 
  // return n + n 也可以
}

Groovy中的函數(shù)調(diào)用有點意思,無參函數(shù)的調(diào)用必須加括號国拇,有參函數(shù)調(diào)用可以不加括號墙歪,參數(shù)之間用逗號隔開

def noArgs() {
    println "Called the no args function"
}
def oneArg(x) {
    println "Called the 1 arg function with $x"
    x
}
def twoArgs(x, y) {
    println "Called the 2 arg function with $x and $y"
    x + y
}


oneArg 500 //ok,沒問題
twoArgs 200, 300//ok贝奇,也沒問題
noArgs //虹菲。。掉瞳。有問題
noArgs() //沒問題

twoArgs oneArg 500, 200 // 這樣的嵌套是有問題的毕源,groovy不能識別你的參數(shù)到底是給誰的
twoArgs oneArg(500), 200 // 這樣就很確定了,500是給oneArg陕习,返回值和200給twoArgs

Groovy的閉包霎褐,感覺和Kotlin的λ表達式基本相同,可以作為一個變量该镣,閉包的調(diào)用和函數(shù)是一樣的

def noArgs = {
    println "Hello from a closure"
    println "The value of foo is $foo"
}//不接受參數(shù)的閉包

def oneArg = { x -> x + x}//接受一個參數(shù)的閉包

noArgs()
twoArgs 200, 300

Groovy的閉包可以通過委托(delegate)來把自己變成一個類的函數(shù)

//定義一個類
class A {
    String b = "123"
    def c(){println "321"}
}
//生成該類對象
def myA = new A()
//定義一個閉包冻璃,在里面操作A類中的變量和函數(shù)
def d = {
    b = "1234"
    c()
}
//這樣調(diào)用是報錯的,他不知道去哪里找到b和c()
d()
//把A類的實例賦值給閉包的委托损合,這樣閉包就可以操作A類的東西了
d.delegate = myA
d() // ok

在Groovy中用閉包來遍歷列表什么的很方便省艳,和kotlin一樣

//定義一個列表
def myList = ["Gradle", "Groovy", "Android"]
//定義一個接受一個參數(shù)的閉包
def printItem = {item -> println "List item: $item"}
//List的each函數(shù)接收一個參數(shù)的閉包,這樣就把所有item打印出來了
myList.each(printItem)
/*
當然如果韓式嫌麻煩的話可以省去定義閉包的部分
這種方式下嫁审,如果函數(shù)接受的閉包是只有一個參數(shù)的跋炕,那么他默認為it
*/
myList.each{println "List item: $it"}

Gradle Now

怎么運行Gradle代碼

  1. 首先要有一個編寫Gradle的地方,只要能打字律适,什么卵都是可以的,我建議使用Sublime
  2. 然后創(chuàng)建一個build.gradle文件,在里面寫代碼憔购,保存
  3. 命令行或者powerShell到當前目錄下,輸入gradle的命令就ok镊辕,比如要看看build.gradle里面有什么task就輸入gradle tasks,要執(zhí)行里面的task就輸入 gradle [taskName]

Task

task就是一個個的任務(wù),可以單獨的執(zhí)行,如下聲明一個task

task("myTask1")//ok
task "myTask2"http://ok
task myTask3//ok
//給任務(wù)加上描述
myTask3.description = "This is what's shown in the task list"
//給任務(wù)分組
myTask3.group = "Some group"
//任務(wù)最后會執(zhí)行的閉包
myTask3.doLast {println "Do this last"}
//任務(wù)一開始就執(zhí)行的閉包
myTask3.doFirst {println "Do this first"}
/*
把這些配置放到閉包configureClosure中也是ok的
*/
task myTask4 {
    description "Here's a task with a configuration block"
    group "Some group"
    doLast {
        println "Here's the action"
    }
}

這樣也是可以的了牛,括號里接受一個Map來描述一些配置信息

task myTask5(description: "Another description") {
    doLast {
        println "Doing something"
    }
}

能以Map的方式寫在括號里的配置還有這些

這里寫圖片描述

命令行輸入gradle tasks看看,本來是會顯示很多東西的德召,但是這里只把和上面代碼有關(guān)的貼出來

snipaste_20171116_120424

上面明明寫了好多個task,但是他只顯示了Some group分組下的兩個task汽纤,其他不見了上岗,仔細看他說To see all tasks and more detail, run gradle tasks --all,試試吧

snipaste_20171116_125645

好的我們定義的task全都出來了蕴坪,有分組的都在同一分組下肴掷,沒分組的在Other tasks下,并且有描述的都可以看見描述”炒現(xiàn)在這些task都是可以執(zhí)行的呆瞻,試試gradle myTask3,輸出如下

Task :myTask3
Do this first
Do this last

Task Dependencies

dependsOn

以下面的代碼為例径玖,表示b依賴于a

執(zhí)行b的結(jié)果:

a

b

執(zhí)行a的結(jié)果:

a

task a {
    doLast {
        println "a"
    }
}

task b {
    dependsOn "a"
    doLast {
        println "b"
    }
}
finalizedBy

以下面的代碼為例痴脾,表示a要以b結(jié)尾

執(zhí)行a的結(jié)果是:

a

b

執(zhí)行b的結(jié)果是:

b

task a {
    finalizedBy "b"
    doLast{
        println "a"
    }
}

task b {
    doLast {
        println "b"
    }
}
shouldRunAfter

以下面的代碼為例,表示如果a和b都要執(zhí)行梳星,那么b應(yīng)該在a的后面執(zhí)行

執(zhí)行a的結(jié)果是:

a

執(zhí)行b的結(jié)果是:

b

a和b一起執(zhí)行的結(jié)果是:

注:多個任務(wù)執(zhí)行命令如右 gradle b a

a

b

task a {
    doLast {
        println "a"
    }
}

task b {
    shouldRunAfter "a"
    doLast{
        println "b"
    }
}
mustRunAfter

個人覺得mustRunAfter和shouldRunAfter的效果是一樣的

執(zhí)行a的結(jié)果是:

a

執(zhí)行b的結(jié)果是:

b

a和b一起執(zhí)行的結(jié)果是:

a

b

task a {
    doLast {
        println "a"
    }
}

task b {
    mustRunAfter "a"
    doLast{
        println "b"
    }
}

TaskType

如果實現(xiàn)每一個功能都要從零開始寫就太麻煩了赞赖,Gradle已經(jīng)為我們準備好了許多有用的Task,在這個網(wǎng)址左邊的導(dǎo)航欄可以找到冤灾,下面介紹怎么使用這些TaskType前域,以復(fù)制文件為例Copy,官網(wǎng)上的例子

//在括號里寫上要使用的TaskType
task copyDocs(type: Copy) {
  //從這個路徑
    from 'src/main/doc'
  //到這個路徑
    into 'build/target/doc'
}

上面就是簡單的使用了Copy這個TaskType來復(fù)制文件韵吨,還有很多高級玩法匿垄,不知道怎么玩的話就看看對應(yīng)TaskType的文檔說明,比如Copy

自定義TaskType

原來的TaskType不夠玩了归粉?那就擴展唄椿疗,其實就是寫一個繼承DefaultTask的類,下面做最簡單的示例

執(zhí)行gradle hello

Me

class MyTask extends DefaultTask {
  //類里面隨便寫
  String who
  /*
  @TaskAction表示這個Task被執(zhí)行的時候會做的事
  */
    @TaskAction
    void doAction() {
        println "Hello $who"
    }
}

task hello(type:MyTask){
  who 'Me' //給who屬性賦值
}

IncrementalBuilds

gradle有個棒棒的地方糠悼,就是他會智能的進行構(gòu)造变丧,假設(shè)就是簡單的把某個文件Copy到某個地方,你運行這個task绢掰,文件復(fù)制好了痒蓬,你再運行一次童擎,她不會再去執(zhí)行一次復(fù)制操作,只要你的輸入輸出沒變攻晒,那么他就不會重復(fù)的執(zhí)行顾复,這在構(gòu)造項目的時候就很有用了,也許你只改了一個字母鲁捏,那他就不需要把所有文件都重新走一遍芯砸。

參數(shù)化構(gòu)建

假設(shè)有下面這樣一個Task,執(zhí)行是肯定會報錯的给梅,找不到y(tǒng)ourName

task hello{
    println "hello $yourName"
}

向task傳遞yourName參數(shù)有三種方式假丧,優(yōu)先級依次遞增

  1. 同目錄下gradle.properties文件中聲明

    yourName = 'chengge'
    

    ?

  2. 命令行輸入

    gradle -PyourName='weige' hello

  3. build.gradle中申明

ext {
    yourName = "jige"
}

如果上面三種方法一起用上,那么效果是

jige

好了好了动羽,水了一天包帚,先到這里了,很多不充分的地方大家提出來呀运吓,不對的地方大家指正呀渴邦!

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市拘哨,隨后出現(xiàn)的幾起案子谋梭,更是在濱河造成了極大的恐慌,老刑警劉巖倦青,帶你破解...
    沈念sama閱讀 216,544評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件瓮床,死亡現(xiàn)場離奇詭異,居然都是意外死亡产镐,警方通過查閱死者的電腦和手機纤垂,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,430評論 3 392
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來磷账,“玉大人峭沦,你說我怎么就攤上這事√釉悖” “怎么了吼鱼?”我有些...
    開封第一講書人閱讀 162,764評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長绰咽。 經(jīng)常有香客問我菇肃,道長,這世上最難降的妖魔是什么取募? 我笑而不...
    開封第一講書人閱讀 58,193評論 1 292
  • 正文 為了忘掉前任琐谤,我火速辦了婚禮,結(jié)果婚禮上玩敏,老公的妹妹穿的比我還像新娘斗忌。我一直安慰自己质礼,他們只是感情好,可當我...
    茶點故事閱讀 67,216評論 6 388
  • 文/花漫 我一把揭開白布织阳。 她就那樣靜靜地躺著眶蕉,像睡著了一般。 火紅的嫁衣襯著肌膚如雪唧躲。 梳的紋絲不亂的頭發(fā)上造挽,一...
    開封第一講書人閱讀 51,182評論 1 299
  • 那天,我揣著相機與錄音弄痹,去河邊找鬼饭入。 笑死,一個胖子當著我的面吹牛肛真,可吹牛的內(nèi)容都是我干的谐丢。 我是一名探鬼主播,決...
    沈念sama閱讀 40,063評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼毁欣,長吁一口氣:“原來是場噩夢啊……” “哼庇谆!你這毒婦竟也來了岳掐?” 一聲冷哼從身側(cè)響起凭疮,我...
    開封第一講書人閱讀 38,917評論 0 274
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎串述,沒想到半個月后执解,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,329評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡纲酗,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,543評論 2 332
  • 正文 我和宋清朗相戀三年衰腌,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片觅赊。...
    茶點故事閱讀 39,722評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡右蕊,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出吮螺,到底是詐尸還是另有隱情饶囚,我是刑警寧澤,帶...
    沈念sama閱讀 35,425評論 5 343
  • 正文 年R本政府宣布鸠补,位于F島的核電站萝风,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏紫岩。R本人自食惡果不足惜规惰,卻給世界環(huán)境...
    茶點故事閱讀 41,019評論 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望泉蝌。 院中可真熱鬧歇万,春花似錦揩晴、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,671評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至缘挽,卻和暖如春瞄崇,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背壕曼。 一陣腳步聲響...
    開封第一講書人閱讀 32,825評論 1 269
  • 我被黑心中介騙來泰國打工苏研, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人腮郊。 一個月前我還...
    沈念sama閱讀 47,729評論 2 368
  • 正文 我出身青樓摹蘑,卻偏偏與公主長得像,于是被迫代替她去往敵國和親轧飞。 傳聞我的和親對象是個殘疾皇子衅鹿,可洞房花燭夜當晚...
    茶點故事閱讀 44,614評論 2 353

推薦閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn)过咬,斷路器大渤,智...
    卡卡羅2017閱讀 134,652評論 18 139
  • 這篇文章講給大家?guī)韌radle打包系列中的高級用法-自己動手編寫gradle插件。我們平常在做安卓開發(fā)時掸绞,都會在...
    呆萌狗和求疵喵閱讀 15,984評論 22 80
  • 導(dǎo)語: 隨著技術(shù)的發(fā)展泵三,不管是前端開發(fā)、服務(wù)端開發(fā)或者是移動端開發(fā)(移動也是前端的一個分支)中都會用到自動化構(gòu)建工...
    伊始雨深閱讀 3,026評論 0 4
  • Gradle對于很多開發(fā)者來說有一種既熟悉又陌生的感覺衔掸,他是離我們那么近烫幕,以至于我每天做項目都需要他,但是他又是離...
    阿_希爸閱讀 9,575評論 10 199
  • Groovy :是一種動態(tài)語言敞映。 1:這種語言比較有特點较曼,它和 Java 一樣,也運行于 Java 虛擬機中振愿。簡單...
    PeytonWu閱讀 1,556評論 0 1