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.
Gradle nicht in groovy geschrieben. Das Gradle-Build-Skript ist ein grooviges DSL. Mit was kämpfst du dagegen? –
Ich schaue mir die Build.Gradle-Datei meines Android Studio-Projekts an. – user3355139
Ist "Abhängigkeit" ein Schlüsselwort in groovy DSL? – user3355139