做過java開發或者android開發,你一定使用gradle,這也是現代大部分項目使用的項目構建和項目依賴管理的工具。
用過很多年,也知道怎麼用,但就是不知道爲什麼要那麼寫,gradle的各種花式配置,到底怎麼是什麼意思呢,要怎麼理解這些寫法呢?
比如以下的gradle配置(android項目的gradle配置)
apply plugin: 'com.android.application'
android {
compileSdkVersion 26
defaultConfig {
applicationId "com.xxx"
minSdkVersion 17
targetSdkVersion 26
versionCode 1
versionName 1.0
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
}
}
dependencies {
implementation fileTree(include: ['*.jar'], dir: 'libs')
implementation 'com.android.support:appcompat-v7:26.+'
implementation 'com.android.support.constraint:constraint-layout:1.1.3'
testImplementation 'junit:junit:4.12'
}
要理解這些,必須先搞清楚Groovy語法,gradle正是基於Groovy來實現的。
Groovy是一種DSL(Domain Specific Languages)特定領域語言,一般只用在特定領域
怎麼去理解Groovy語言呢?
廢話少說,先寫個hello world!
如果你用的是 idea 工具,一般 tools菜單下都一個 Groovy Console
以android studio爲例
打開以後,什麼都沒有。
1、先寫個hello world
點擊綠色三角形運行
這是這樣:
運行結果
2、定義一個變量
//定義一個變量i,i爲弱類型,它會根據賦的值來定義類型
def i = 1
println i
def s = 'hello'
println s
3、定義一個集合
//定義一個List集合
list = ['a','b']
println(list.get(1)) //輸出b
//向集合添加數據
list << 'c'
println(list.get(2)) //輸出c
//定義一個map集合
map = [
key1:'value1',
key2:'value2'
]
println(map.key1)//輸出value2
//向Map添加數據
map.key3 = 'value3'
println(map.key3)//輸出value3
4、定義一個方法
//定義一個方法,參數爲map
void method1(Map<String,?> args){
println(args.key1)
}
//調用
method1 key1:'value1' //輸出value1
5、定義一個閉包(閉包其實就是一個代碼塊)
//定義一個閉包(閉包其實就是一個代碼塊)
bb = {
println('hello bibao')
}
//定義一個方法,參數爲閉包類型
static void method1(Closure closure){
closure()
}
//調用方法
method1(bb)//輸出 hello bibao
//定義一個帶參閉包
bb2 = {
name ->
println('hello '+name)
}
static void method2(Closure closure,String name){
closure(name)
}
//調用方法
method2(bb2,"帶參閉包") //輸出 hello 帶參閉包
6、創建一個對象,跟java語法類似
class MyClass{
}
現在我們可以來重新理解一下gradle中寫的哪些玩意了
比如文章開始貼的gradle配置 :
apply plugin: 'com.android.application'
// apply是一個方法,參數爲map,這裏傳的鍵值對爲 plugin: 'com.android.application'
//android 是一個方法,參數是一個閉包
android {
compileSdkVersion 26
//compileSdkVersion 是一個方法,參數爲int,值爲26,也可以寫成compileSdkVersion(26)
defaultConfig {
applicationId "com.xxx"
//applicationId 是一個方法,參數爲String,值爲 "com.xxx",也可以寫成 applicationId ("com.xxx")
minSdkVersion 17
//同上
targetSdkVersion 26
//同上
versionCode 1
//同上
versionName 1.0
//同上
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
//同上
}
//defaultConfig 是一個是一個方法,參數是一個閉包
}
//dependencies 是一個方法,參數是一個閉包
dependencies {
implementation fileTree(include: ['*.jar'], dir: 'libs')
//implementation是一個方法,參數爲ConfigurableFileTree
//fileTree 是一個方法,參數爲Map<String,Object>,該方法返回一個ConfigurableFileTree對象
//Map中的第一個參數是include是key ,['*.jar']是Value,它一個List集合。
implementation 'com.android.support:appcompat-v7:26.+'
//同上
implementation 'com.android.support.constraint:constraint-layout:1.1.3'
//同上
testImplementation 'junit:junit:4.12'
//同上
}