Gradle語法的理解

做過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'
    //同上
}

終於可以理解gradle配置中的各種花式寫法了

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章