安裝Gradle
- 確保安裝你的電腦了Java7或以上版本
- 在這里下載最新的Gradle distribution
- 創(chuàng)建一個文件夾,把下載的壓縮包解壓進去(以
C:\Gradle
為例)猾漫,然后進入文件夾中的bin目錄汁政,復(fù)制路徑(C:\Gradle\gradle-4.3.1\bin
)批狐,把路徑加入到系統(tǒng)環(huán)境變量的Path
中 - 命令行輸入
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代碼
- 首先要有一個編寫Gradle的地方,只要能打字律适,什么卵都是可以的,我建議使用Sublime
- 然后創(chuàng)建一個
build.gradle
文件,在里面寫代碼憔购,保存 - 命令行或者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)的貼出來
上面明明寫了好多個task,但是他只顯示了Some group分組下的兩個task汽纤,其他不見了上岗,仔細看他說To see all tasks and more detail, run gradle tasks --all
,試試吧
好的我們定義的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)先級依次遞增
-
同目錄下
gradle.properties
文件中聲明yourName = 'chengge'
?
-
命令行輸入
gradle -PyourName='weige' hello
build.gradle
中申明
ext {
yourName = "jige"
}
如果上面三種方法一起用上,那么效果是
jige
好了好了动羽,水了一天包帚,先到這里了,很多不充分的地方大家提出來呀运吓,不對的地方大家指正呀渴邦!