2017-04-26 114 views
0

我讀過gradle是用groovy編寫的。
但是,我的build.gradle文件看起來不像groovy。
事實上,它看起來不像一種語言。 這是我的build.gradle文件:爲什麼build.gradle看起來不像Groovy?

apply plugin: 'com.android.application' 

android { 
    compileSdkVersion 25 
    buildToolsVersion "25.0.2" 
    defaultConfig { 
     applicationId "com.israelkariti.location2_1" 
     minSdkVersion 14 
     targetSdkVersion 25 
     versionCode 1 
     versionName "1.0" 
     testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" 
    } 
    buildTypes { 
     release { 
      minifyEnabled false 
      proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' 
     } 
    } 
} 

dependencies { 
    compile fileTree(dir: 'libs', include: ['*.jar']) 
    androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', { 
     exclude group: 'com.android.support', module: 'support-annotations' 
    }) 
    compile 'com.android.support:appcompat-v7:25.3.1' 
    compile 'com.android.support.constraint:constraint-layout:1.0.0-beta4' 
    compile 'com.google.android.gms:play-services-maps:10.2.1' 
    testCompile 'junit:junit:4.12' 
} 

可有人請向我解釋什麼了這個語法。
該語法如何成爲Groovy代碼?
如果我錯過了一些比請詳細說明這件事情的工作。
謝謝

+0

Gradle不是用groovy編寫的。 Gradle構建腳本是一個Groovy DSL。哪一個,但你在掙扎? –

+0

我看着我的android studio項目的build.gradle文件。 – user3355139

+0

groovy DSL中的「依賴」是否爲關鍵字? – user3355139

回答

0

那麼,Gradle增加了它的DSL的一些魔力,但從技術上講每個Gradle腳本都是完全有效的Groovy。

要了解所有的事情就像dependenciesapply plugin:等等,我們需要了解不同類型的搖籃腳本:

  • 構建腳本(build.gradle
  • 設置腳本(settings.gradle
  • 初始化腳本(例如init.gradle

所有這些腳本都是e在不同的範圍內執行,因爲它們「應用於」不同的對象。 Gradle將此行爲稱爲「附加委託對象」。

對於構建腳本(就像你問的那樣),這個對象是一個Project。現在讓我們來分析你的搖籃腳本:

apply plugin: 'com.android.application'

Project接口擴展了PluginAware接口,它定義了一個apply方法採取Map<String,?>。在Groovy中,映射表示法是[key:value, ...],括號可以省略,String類型的映射鍵不會用引號引起來。因此,plugin: 'com.android.application'只不過是一個Groovy映射,並將其交給apply方法。

dependencies { 
    compile fileTree(dir: 'libs', include: ['*.jar']) 
    ... 
} 

我會繼續這一部分,並與android部分完成,因爲它更容易理解這種方式:

dependencies不是一個搖籃關鍵字,其根本的已經是一個方法的名稱接口提到了Project。這種方法需要一個Closure,它包裹在大括號內。普通的方法調用括號再次被省略。關閉在DependencyHandler對象上執行。現在我們只需將依賴關係添加到我們的配置。我們可以使用add方法並傳遞一個配置名稱和一個依賴表示法(以及可選的新閉包)。

這裏開始了Gradle的魔法。對於項目的ConfigurationContainer中的每個現有配置,在DependencyHandler中都會添加一個名稱爲相應配置的新方法,因此我們可以簡單地使用此方法而不是始終使用add。當爲Java開發時,這些配置及其方法是compile,runtime,testCompile(等等)。fileTree再次只是Project接口的一種方法。

android { 
    compileSdkVersion 25 
    ... 
} 

Project接口定義的方法不是唯一可用的方法。 Gradle插件(如您正在使用的Android插件)可以添加擴展約定。通過這種方式,可以調用屬性和方法,就像它們屬於Project對象一樣。這就是android部分如何通過構建腳本中的閉包權來配置。

android封閉中,發生了一些額外的Gradle魔法。您可能知道,在Groovy中,可以省略getset部分並直接訪問屬性(儘管仍可能調用getter或setter)。 Gradle還爲每個屬性添加了一個方法,該屬性的名稱可以用作setter。這樣,我們可以調用compileSdkVersion方法來設置compileSdkVersion屬性。再一次,括號被省略。這只是一些語法糖,可以讓我們省略賦值操作符。

每當你開始一個新的大括號級別,你基本上使用閉包來配置一個對象。有時會創建一個新對象,有時會使用現有的屬性。有時候,您需要閱讀文檔以瞭解到底發生了什麼。

+0

非常感謝。 當你說「這只是一些語法糖,讓我們省略賦值運算符」你的意思是 - 省略括號? 替換 compileSdkVersion(25) 與 compileSdkVersion 25 – user3355139

+0

** Groovy **允許您省略所有'不必要'的括號,它是一種語言功能。所以,是的,您可以感謝Groovy編寫'compileSdkVersion 25'而不是'compileSdkVersion(25)'。但通常'compileSdkVersion'不是一個方法,它是一個屬性,所以你可以通過'compileSdkVersion = 25'給它賦值。現在,** Gradle **爲您生成所提到的方法,這是一個框架功能,您可以省略'='符號。 –

相關問題