1.Build
每個Project都會有一個Build文件,該文件是Project構(gòu)建的入口,可以在這里針對該Project進行配置,比如配置版本,需要哪些插件,依賴哪些庫等。
比如我們在開發(fā)一個大型Java工程時,該工程被分為很多小模塊,每個模塊都是一個Child Project,這些模塊同樣也是Java工程,這種情況我們也可以統(tǒng)一配置,應(yīng)用Java插件:
subprojects{
apply plugin: 'java'
repositories{
jcenter()
}
}
除了提供的subprojects之外,還有allprojects,從其名字就可以看出來,是對所有Project的配置。但是大家不要誤以為subprojects和allprojects只能配置。它們是兩個方法,接受一個閉包作為參數(shù),對工程進行遍歷,遍歷的過程中調(diào)用我們自定義的閉包,所以我們可以在閉包里配置、打印、輸出或修改Project的屬性都可以。
2.任務(wù)依賴
任務(wù)之間是可以有依賴關(guān)系的,這樣我們就能控制哪些任務(wù)先于哪些任務(wù)執(zhí)行。比如我們運行jar任務(wù)之前,compile任務(wù)一定要執(zhí)行過,也就是jar依賴于compile。
task ex<<{
println "ex"
}
task exMain(dependsOn:ex){
doLast{
println "main"
}
}
執(zhí)行命令:gradle exMain
輸出:
Task :ex
ex
Task :exMain
main
通過dependsOn可以指定依賴的任務(wù),exMain任務(wù)依賴于ex,所以會先執(zhí)行ex任務(wù),然后再執(zhí)行exMain任務(wù)。
同時依賴多個任務(wù):
task ex<<{
println "ex"
}
task ex2<<{
println "ex2"
}
task exMain{
dependsOn ex,ex2
doLast{
println "main"
}
}
輸出:
Task :ex
ex
Task :ex2
ex2
Task :exMain
main
3.任務(wù)間通過API控制、交互
創(chuàng)建一個任務(wù)和我們定義一個變量是一樣的,變量名就是我們定義的任務(wù)名,類型是Task。所以我們可以通過任務(wù)名,使用Task的API訪問它的方法、屬性或者對任務(wù)重新配置等。
和變量一樣,要使用任務(wù)名操縱任務(wù),必須先定義聲明,因為腳本是順序執(zhí)行的:
task ex3<<{
println "ex3"
}
ex3.doFirst{
println "doFirst"
}
ex3.doLast{
println "doLast"
}
輸出:
Task :ex3
doFirst
ex3
doLast
如上示例,我們調(diào)用了doLast和doFirst方法,在任務(wù)執(zhí)行前后做一些事情。對于直接通過任務(wù)名操縱任務(wù)的原理是:Project在創(chuàng)建的時候,同時把該任務(wù)對應(yīng)的任務(wù)名注冊為Project的一個屬性,類型是Task。
3.自定義屬性
Project和Task都允許用戶添加額外的自定義屬性,要添加額外的屬性,通過應(yīng)用所屬對應(yīng)的ext屬性即可實現(xiàn)。添加之后可以通過ext屬性對自定義屬性讀取和設(shè)置,如果要同時添加多個自定義屬性,可以通過ext代碼塊:
task ex4<<{
//自定義一個Project的屬性
ext.age=18
//通過代碼塊同時自定義多個屬性
ext{
phone=1255
address='北京'
}
println "年齡:{phone}"
println "地址:${address}"
}
輸出:
Task :ex4
年齡:18
電話:1255
地址:北京
相比于局部變量,自定義屬性有更為廣泛的作用域,你可以跨Project,跨Task訪問這些自定義屬性。
自定義屬性不僅僅局限在Project和Task上,還可以應(yīng)用在SourceSet中,這樣等于每種SourceSet又多了一個可供配置的屬性。
apply plugin:"java"
//自定義一個Project的屬性
ext.age=18
//通過代碼塊同時自定義多個屬性
ext{
phone=1255
address='北京'
}
sourceSets.all{
ext.resourcesDir=null
}
sourceSets{
main{
resourcesDir='main/res'
}
test{
resourcesDir='test/res'
}
}
task ex4<<{
println "年齡:{phone}"
println "地址:{it.name}的resourcesDir是:${it.resourcesDir}"
}
}
輸出:
Task :ex4
年齡:18
電話:1255
地址:北京
main的resourcesDir是:main/res
test的resourcesDir是:test/res
從程序運行可見,我們自定義的屬性都生效了。在項目中一般使用它來自定義版本號和版本名稱,把版本號和版本名稱單獨放在一個gradle文件中。。
4.腳本即代碼,代碼也是腳本
雖然我們在一個Gradle文件中寫腳本,但是我們寫的都是代碼,這一點一定要記住,這樣才能時刻使用Groovy、Java以及Gradle的任何語法和API幫你完成你想要做的事情。不要被腳本這兩個字給限制住。在這個腳本文件上你可以定義Class、內(nèi)部類、導(dǎo)入包、定義方法、常量、接口、枚舉等,都是可以的,靈活運用。我們在項目中需要給生成的apk包以當(dāng)前日期的格式命名,我們就定義一個獲取日期格式的方法,用于生成apk的文件名:
task ex5<<{
def date=new Date()
def formatDate=date.format('yyyyMMddMMSS')
println "當(dāng)前時間${formatDate}"
}
輸出:
Task :ex5
當(dāng)前時間2018082308619