2017-04-26 5 views
0

Ich las das Gravelle wurde in groovy geschrieben.
Allerdings sieht meine build.gradle Datei nicht wie groovy aus.
Tatsächlich sieht es überhaupt nicht wie eine Sprache aus. Hier ist meine build.gradle Datei:Warum sieht build.gradle nicht wie Groovy aus?

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

Kann jemand mir bitte erklären, was mit dieser Syntax liegt.
Wie ist diese Syntax ein Groovy-Code?
Und wenn ich etwas großes vermisse, bitte erläutern Sie, wie dieses Ding funktioniert.

+0

Gradle nicht in groovy geschrieben. Das Gradle-Build-Skript ist ein grooviges DSL. Mit was kämpfst du dagegen? –

+0

Ich schaue mir die Build.Gradle-Datei meines Android Studio-Projekts an. – user3355139

+0

Ist "Abhängigkeit" ein Schlüsselwort in groovy DSL? – user3355139

Antwort

0

Nun, Gradle fügt etwas Magie für seine DSL, aber technisch gesprochen ist jedes Gradle-Skript voll gültig Groovy.

Um alle Dinge wie dependencies, apply plugin: und so weiter zu verstehen, müssen wir über die verschiedenen Arten von Gradle Skripte lernen:

  • Build-Skripte (build.gradle)
  • Einstellungen Skripte (settings.gradle)
  • Initialisierungsskripte (z. B. init.gradle)

Alle diese Skripts sind e in verschiedenen Bereichen ausgeführt, da sie auf verschiedene Objekte "angewendet" sind. Gradle ruft dieses Verhalten auf, indem es ein Delegate-Objekt anfügt.

Für Build-Skripte (wie die, über die Sie gefragt), ist dieses Objekt ein Project. Jetzt können Sie Ihre Gradle Skript analysieren:

apply plugin: 'com.android.application'

Die Project Schnittstelle erweitert die PluginAware-Schnittstelle, die eine apply Methode definiert eine Map<String,?> nehmen. In Groovy ist die Kartennotation [key:value, ...], Klammern können weggelassen werden und Kartenschlüssel des Typs String sind nicht in Anführungszeichen geschrieben. Also, plugin: 'com.android.application' ist nichts anderes als eine Groovy Karte und es wurde an die apply Methode übergeben.

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

ich mit diesem Teil fortsetzen würde und mit dem android Teil beenden, weil es einfacher auf diese Weise zu verstehen:

dependencies ist kein Gradle Schlüsselwort, es ist einfach der Name einer Methode der bereits erwähnte Project Schnittstelle. Diese Methode nimmt eine Closure, die in den Klammern gewickelt ist. Die Aufrufklammern der normalen Methode werden wieder weggelassen. Der Verschluss wird auf einem DependencyHandler Objekt ausgeführt. Jetzt fügen wir nur Abhängigkeiten zu unseren Konfigurationen hinzu. Wir könnten die Methode add verwenden und einen Konfigurationsnamen und eine Abhängigkeitsnotation (und optional einen neuen Abschluss) übergeben.

Hier beginnt die Gradle Magie. Für jede vorhandene Konfiguration in ConfigurationContainer des Projekts wird eine neue Methode mit dem Namen der entsprechenden Konfiguration zu DependencyHandler hinzugefügt, sodass wir diese Methode einfach verwenden können, anstatt die ganze Zeit add zu verwenden. Bei der Entwicklung für Java sind diese Konfigurationen und daher die Verfahren compile, runtime, testCompile (unter anderem).Die fileTree ist wiederum nur eine Methode der Project Schnittstelle.

android { 
    compileSdkVersion 25 
    ... 
} 

Die Verfahren, durch die Project Schnittstelle definiert sind nicht die einzigen verfügbaren Methoden. Gradle Plugins (wie das Android-Plugin Sie verwenden) können Erweiterungen oder Konventionen hinzuzufügen. Auf diese Weise können Eigenschaften und Methoden so aufgerufen werden, wie sie zum Objekt Project gehören würden. So kann der android Teil über ein Closure direkt im Buildskript konfiguriert werden.

Im Inneren des android Schließung, einige zusätzliche Gradle Magie passiert. Sie wissen wahrscheinlich, dass Sie in Groovy den get oder set Teil weglassen und Eigenschaften direkt zugreifen können (während mögliche Getter oder Setter immer noch aufgerufen werden). Gradle fügt außerdem für jede Eigenschaft eine Methode mit dem Namen der Eigenschaft hinzu, die als Setter verwendet werden kann. Auf diese Weise können wir die compileSdkVersion-Methode aufrufen, um die compileSdkVersion-Eigenschaft festzulegen. Wiederum sind Klammern weggelassen. Dies ist nur ein wenig syntaktischer Zucker, wodurch wir den Zuweisungsoperator weglassen können.

Wenn Sie eine neue Zahnspange Ebene zu starten, verwenden Sie grundsätzlich einen Verschluss, ein Objekt zu konfigurieren. Manchmal wird ein neues Objekt erstellt, manchmal wird eine vorhandene Eigenschaft verwendet. Manchmal müssen Sie die Dokumentation lesen, um zu verstehen, was genau passiert.

+0

Vielen Dank. Wenn Sie sagen "Dies ist nur ein wenig syntaktischer Zucker, der uns den Zuweisungsoperator weglassen kann" meinst du - die Klammern weglassen? ersetzen compileSdkVersion (25) mit compileSdkVersion 25 – user3355139

+0

** Groovy ** lässt Sie alle unnötigen Klammern weglassen, es ist eine Sprachfunktion. Also, ja, Sie können Groovy für das Schreiben von 'compileSdkVersion 25' anstelle von' compileSdkVersion (25) 'danken. Aber normalerweise ist 'compileSdkVersion' keine Methode, es ist eine Eigenschaft, also könnten Sie ihr über' compileSdkVersion = 25' einen Wert zuweisen. ** ** Gradle ** erzeugt jetzt die erwähnte Methode für Sie, es ist ein Framework-Feature, nur damit Sie das Symbol '=' weglassen können. –

Verwandte Themen