2015-04-06 10 views
5

बताएं कि निम्न ग्रोवी वाक्यविन्यास का वास्तव में क्या अर्थ है?कृपया एंड्रॉइड build.gradle groovy वाक्यविन्यास

ग्रैडल दस्तावेज़ बताते हैं कि build.gradle केवल ग्रोवी है। एंड्रॉइड टीम ने डिफ़ॉल्ट बिल्ड को सरल बना दिया है। इस बिंदु पर इंगित करें कि यह कोड (कम से कम मेरे लिए) जैसा नहीं दिखता है। ग्रोवी सिंटैक्स के मामले में यह बताएं कि यह क्या कर रहा है। उदाहरण के लिए, क्या इन वैश्विक परिवर्तनीय घोषणाएं हैं कि एंड्रॉइड प्लगइन का उपयोग करता है?

बोनस अंक यदि आप अपनी व्याख्या के हिस्से के रूप में http://groovy-lang.org/syntax.html के संदर्भ शामिल करते हैं।

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']) 
} 

उत्तर

3

उत्कृष्ट वीडियो की आपूर्ति के लिए AndroidGuy के लिए धन्यवाद जो मुझे नीचे दी गई जानकारी के बारे में सूचित करता है। वीडियो 35 मिनट लंबा है, इसलिए यहां टीएल है; डीआर।

इनमें से अधिकांश वाक्यविन्यास method कॉल और closures का मिश्रण है। बंद घुंघराले ब्रेसिज़ द्वारा प्रतिनिधित्व किया जाता है। यह भी ध्यान रखें कि विधि कॉल को ब्रांड्स की आवश्यकता नहीं है।

apply plugin: 'com.android.application' 

यह एक एकल नामित पैरामीटर "प्लगइन" के साथ project वस्तु पर apply विधि बुला रहा है। प्रोजेक्ट ऑब्जेक्ट ग्रैडल द्वारा प्रदान की गई शीर्ष स्तरीय वस्तु है।

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

यह प्रोजेक्ट ऑब्जेक्ट की dependencies संपत्ति सेट कर रहा है। Groovy properties मूल रूप से गेटर्स और सेटर्स के लिए शॉर्टेंड हैं। निर्भरता संपत्ति एक क्लोजर ऑब्जेक्ट है जो DependencyHandler पर प्रतिनिधि है। Groovy delegation अनिवार्य रूप से बंद होने के दायरे के संकल्प को बढ़ाने का एक तरीका है। निर्भरता बंद करने में संकलन के लिए एक विधि विधि शामिल है, जो FileTree स्थितित्मक पैरामीटर लेता है। FileTree fileTree विधि द्वारा उत्पन्न किया गया है जिसे प्रोजेक्ट ऑब्जेक्ट में परिभाषित किया गया है। संकलन विधि अभी भी मेरे लिए थोड़ा अस्पष्ट है। ऐसा लगता है कि Java plugin से आता है, लेकिन यह स्पष्ट रूप से वहां दस्तावेज नहीं है। 'संकलन' भाग अभी भी मेरे लिए थोड़ा जादुई है।

android { 
    ... 
} 

मैं पाठक को एक अभ्यास के रूप में 'एंड्रॉइड' अनुभाग छोड़ दूंगा। एंड्रॉइड ग्रैडल डोमेन विशिष्ट भाषा (डीएसएल) वेब पर उपलब्ध नहीं है। आपको download it होना है।

2

मैं मैं सिर्फ एक जवाब के रूप एक लिंक पोस्ट नहीं करना चाहिए पता है, लेकिन इस से वास्तव में कोई बेहतर व्याख्या दी गई है:

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

+1

हालांकि यह लिंक प्रश्न का उत्तर दे सकता है, लेकिन यहां उत्तर के आवश्यक हिस्सों को शामिल करना बेहतर है और संदर्भ के लिए लिंक प्रदान करना बेहतर है। लिंक किए गए पृष्ठ में परिवर्तन होने पर लिंक-केवल उत्तर अमान्य हो सकते हैं –

5

आप कुछ कोड के रूप में एक Gradle निर्माण स्क्रिप्ट के बारे में सोच सकते हैं जो किसी ऑब्जेक्ट को दिया गया है जो उसमें लिखित विधि कॉल का जवाब दे सकता है।

स्क्रिप्ट, ग्रूवी वाक्यात्मक चीनी का एक बहुत का उपयोग करता है तो उन्हें हटाने, यह इस तरह दिखना चाहिए:

तो स्क्रिप्ट वास्तव में विधि का एक समूह कॉल किया जाता है:

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

यह android(Closure) एक बंद प्राप्त होगा और एक वस्तु जो इन तरीकों का जवाब कर सकते हैं करने के तरीकों में यह कहा जाता प्रतिनिधि होगा:

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

को देखते हुए कि, हम पार्स स्क्रिप्ट कर सकते हैं, इसे किसी ऑब्जेक्ट और टी को प्रतिनिधि दें मुर्गी इसे निष्पादित करें।

DelegatingBaseScript का उपयोग करके प्रतिनिधि इसे करने का एक तरीका है (सुनिश्चित नहीं है कि ग्रैडल इस तरह से करता है)।

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' 
    ] 
] 

आप Groovy Web Console में स्क्रिप्ट को निष्पादित ("कंसोल में संपादित करें" क्लिक करें और फिर "स्क्रिप्ट निष्पादित") कर सकते हैं: यहाँ एक नीचे dumbed काम कर संस्करण है।

वाक्य रचना स्पष्टीकरण के अधिकांश DSL section में हैं:

  1. कमान चेन

ग्रूवी आप शीर्ष-स्तर स्टेटमेंट के लिए एक विधि कॉल के तर्कों के आसपास कोष्ठकों को छोड़ देता है। "कमांड चेन" सुविधा हमें इस तरह के कोष्ठक मुक्त विधि कॉल करने की इजाजत देकर विस्तारित करती है, जिसके लिए न तो तर्कों के चारों ओर कोष्ठक की आवश्यकता होती है, न ही जंजीर कॉल के बीच बिंदु।

ग्रोवी ConfigSlurper भी है, लेकिन मुझे यकीन नहीं है कि यह ग्रैडल चाहे जहां तक ​​जा सके।

संबंधित मुद्दे