2015-04-06 16 views
5

Aşağıdaki mükemmel sözdizimi ne anlama geliyor?Lütfen Android build.gradle groovy sözdizimini açıklayın

Gradle dokümanlar, build.gradle'nin sadece groovy şeklindedir. Android ekibi, varsayılan build.gradle kodunu (en azından bana) kod gibi görünmediği noktaya kadar basitleştirdi. Lütfen bunun neyin sözdizimi anlamında olduğunu açıklayınız. Örneğin, Android eklentisinin kullandığı bu küresel değişken bildirimlerdir?

Açıklamalarınızın bir parçası olarak http://groovy-lang.org/syntax.html'a referanslar eklerseniz bonus puanları.

apply plugin: 'com.android.application' 

android { 
    compileSdkVersion 21 
    buildToolsVersion "21.1.2" 

    defaultConfig { 
     applicationId "com.crittercism" 
     minSdkVersion 15 
     targetSdkVersion 21 
     versionCode 5 
     versionName "5.0" 
    } 

} 

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

cevap

3

Aşağıdaki bilgileri bana bildiren mükemmel videoyu sağlamak için AndroidGuy'a teşekkürler. Video 35 dakikadır, yani TL, DR.

Bu sözdiziminin çoğu, method çağrıları ve closures'un bir karışımıdır. Kapaklar küme parantezleri ile temsil edilir. Ayrıca, yöntem çağrılarının parantez gerektirmediğini unutmayın.

apply plugin: 'com.android.application' 

Bu, tek bir adlandırılan bir parametre "eklentisi" ile project nesnesinde apply yöntemi çağırmaktadır. Proje nesnesi, Gradle tarafından sağlanan en üst düzey nesnedir.

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

Bu, proje nesnesinin dependencies özelliğini ayarlıyor. Groovy properties, alıcılar ve ayarlayıcılar için temelde kısadır. Bağımlılıklar özelliği, DependencyHandler'a delege veren bir Kapanış nesnesidir. Groovy delegation aslında bir kapağın kapsam çözümünü büyütmenin bir yoludur. Bağımlılıklar kapatılması, derleme için tek bir yöntem çağrısı içerir ve bu, FileTree konumsal parametresini alır. FileTree, proje nesnesinde tanımlanan fileTree yöntemiyle oluşturulur. Derleme metodu benim için hala biraz belirsiz. Java plugin'dan geliyor gibi görünüyor, ancak orada açıkça belgelenmiyor. 'Derleme' kısmı benim için hala biraz büyülü.

android { 
    ... 
} 
Ben okuyucuya bir alıştırma olarak 'android' bölümünü bırakacağım

. Android Gradle Domain Specific Language (DSL), web'de mevcut değildir. download it'a sahip olmalısınız.

2

ben sadece bir cevap olarak bir bağlantı sonrası gerektiğini biliyorum, ama bu daha çok daha iyi bir açıklaması var:

"An introduction to Groovy, Gradle and the Android plugin" by Daniel Lew

+1

Bu bağlantı soruyu yanıtlayabilirken, cevabın temel kısımlarını buraya eklemek ve referans için bağlantı sağlamak daha iyidir. Bağlantılı sayfa değiştiğinde yalnızca bağlantı yanıtları geçersiz olabilir –

5

Bazı kod olarak bir gradle yapı komut düşünebiliriz , içinde yazılı olan yöntem çağrılarına yanıt verebilecek bir nesneye verilen bir temsilci.

Senaryo çok bunları kaldırmayı, Groovy sözdizimsel çok şeker kullanır, bu gibi görünmelidir:

Yani senaryo gerçekten yöntemin bir demet çağırır:

  • def apply(Map)
  • def android(Closure)
  • def dependencies(Closure)

Bu android(Closure) bir kapatma alacak ve bu yöntemlerin yanıt verebilir bir nesneye içinde denilen yöntemleri devredeceğini:

  • def compileSdkVersion(Integer)
  • def buildToolsVersion(String)
  • ...

Verilen Bu, biz parsayı betiğine yapabiliriz, bazı nesnelere ve Onu çalıştır.

DelegatingBaseScript kullanarak yetki verme, bunu yapmanın bir yoludur (Gradle bunu bu şekilde yapıp yapmadığından emin değil).

import org.codehaus.groovy.control.CompilerConfiguration 

gradleScript = ''' 
apply plugin: 'com.android.application' 

android({ 
    compileSdkVersion(21) 
    buildToolsVersion("21.1.2") 
})''' 


class PocketGradle { 
    def config = [apply:[]].withDefault { [:] } 

    def apply(map) { 
    config.apply << map.plugin 
    } 

    def android(Closure closure) { 
    closure.delegate = new Expando(
     compileSdkVersion: { Integer version -> 
      config.android.compileSdkVersion = version 
     }, 
     buildToolsVersion : { String version -> 
      config.android.buildToolsVersion = version 
     }, 
    ) 
    closure() 
    } 
} 

def compiler = new CompilerConfiguration(scriptBaseClass: DelegatingScript.class.name) 

shell = new GroovyShell(this.class.classLoader, new Binding(), compiler) 

script = shell.parse gradleScript 
script.setDelegate(gradle = new PocketGradle()) 
script.run() 

assert gradle.config == [ 
    apply: ['com.android.application'], 
    android: [ 
    compileSdkVersion: 21, 
    buildToolsVersion: '21.1.2' 
    ] 
] 

Sen ("komut çalıştır" ardından "konsoldaki Düzenle" tıklayın ve) Groovy Web Console içinde çalıştırabiliriz: Burada bir dumbed çalışma sürümüdür.sözdizimi açıklama çoğu

DSL section içindedir:

  1. Komut zincirleri

Groovy üst düzey ifadeleri için bir yöntemdir çağrısının argümanlar etrafında parantez ihmal sağlar. "komut zinciri" özelliği, bu tür parantez içermeyen yöntem çağrılarını zincirlememize izin vererek, bağımsız değişkenler etrafında parantezler veya zincirleme çağrılar arasında noktalar gerektirmemesiyle genişletir.

Ayrıca Groovy ConfigSlurper da var, ancak Gradle istediği kadar gidebileceğinden emin değilim.

İlgili konular