Zweck des Buildscript-Blocks in Gradle

235

Ich bin neu bei Gradle und lese die Dokumentation, aber ich verstehe einige Teile davon nicht. Einer dieser Teile ist mit einem buildscriptBlock verbunden. Was ist seine Aufgabe?

Wenn Ihr Build-Skript externe Bibliotheken verwenden muss, können Sie diese dem Klassenpfad des Skripts im Build-Skript selbst hinzufügen. Sie tun dies mit der Methode buildcript () und übergeben einen Abschluss, der den Klassenpfad des Erstellungsskripts deklariert.

buildscript {
  repositories {
    mavenCentral()
  }
  dependencies {
    classpath group: 'commons-codec', name: 'commons-codec', version: '1.2'
  }
}

Ok, aber was ist der Unterschied zu:

repositories {
  mavenCentral()
}
dependencies {
  compile group: 'commons-codec', name: 'commons-codec', version: '1.2'
}

Warum ist es zum Beispiel notwendig zu verwenden buildscript?

Xelian
quelle
1
Mögliches Duplikat von Gradle Buildscript-Abhängigkeiten
Fejese

Antworten:

177

Der buildScriptBlock bestimmt, welche Plugins, Taskklassen und anderen Klassen für den Rest des Buildskripts verfügbar sind . Ohne buildScriptBlock können Sie alles verwenden, was mit Gradle ausgeliefert wird. Wenn Sie zusätzlich Plugins, Taskklassen oder andere Klassen von Drittanbietern (im Build-Skript!) Verwenden möchten, müssen Sie die entsprechenden Abhängigkeiten im buildScriptBlock angeben .

Peter Niederwieser
quelle
2
Ich kann Em nicht verstehen. Ich schrieb eine Taskklasse mit Gruppe: sample.infotask', name: 'infotask', version: '1.0'Und Verwendung _uploadArchives Aufgabe es zu lokalen Repo hochladen ../lib ‚ Im einem anderen Projekt , wenn ich meine Aufgabe verwende ich muss schreiben:` buildscript {{Repositorys maven {url‘file: ../ lib '}} Abhängigkeiten {Klassenpfadgruppe:' sample.infotask ', Name:' infotask ', Version:' 1.0 '}} Habe ich recht? Warum müssen wir den BuildScript- Block verwenden? Wenn ich ein lokales Artefakt hochlade, befindet sich das Glas auf meinem Computer. Und muss ich Gradle nur sagen, woher und was ich in meinen Klassenpfad einfügen soll, sonst nichts, was das Besondere hier ist?
Xelian
40
Sie müssen einen buildScriptBlock verwenden, da Gradle diese Informationen benötigt, um den Rest des Build-Skripts zu verstehen . Deshalb müssen Sie diese Informationen in einem separaten Kanal (dem buildScriptBlock) bereitstellen . Technisch gesehen benötigt Gradle diese Informationen , um den Rest des Build-Skripts zu kompilieren und auszuwerten . Unter der Haube passiert, dass Gradle das Build-Skript in zwei Skripte (den buildScriptBlock und alles andere) unterteilt, damit es sie separat verarbeiten kann.
Peter Niederwieser
1
Wenn Sie diese und andere Antworten lesen, können Sie verstehen, was Peter sagen möchte (und was ziemlich richtig ist). Aber die zweite Zeile - "Ohne einen BuildScript-Block können Sie alles verwenden, was mit Gradle ausgeliefert wird" - macht das Ans mehrdeutig.
Dexter
Nur eine kurze Notiz, die mich das Ganze verstehen ließ. Wenn Sie "Buildscript" verwenden, sagen Sie, dass alle Abhängigkeiten in Buildscript {...} nicht vom Java / Kotlin-Code / -Programm (oder was auch immer Sie verwenden) verwendet werden. Stattdessen sollen sie NUR von Gradle-Skripten verwendet werden. So müssen Sie beispielsweise einige Plugins verwenden, die nicht standardmäßig bereitgestellt werden. Dann fügen Sie sie in Buildscript {...} hinzu und können sie nur für Gradle-Skripte verwenden. hoffe es hilft
cesarmax
153
  • Auf globaler Ebene dependenciesund in den repositoriesAbschnitten sind Abhängigkeiten aufgeführt, die zum Erstellen Ihrer Quelle und zum Ausführen Ihrer Quelle usw. erforderlich sind.
  • Das buildscriptist für die build.gradleDatei selbst. Dies würde also Abhängigkeiten zum Erstellen von RPMs Dockerfileund andere Abhängigkeiten zum Ausführen der Aufgaben in allen abhängigen Bereichen enthaltenbuild.gradle
Ashish
quelle
4
Alle Erweiterungen für Gradle selbst werden über Buildscript-> Abhängigkeiten gefunden, die wiederum aus dem Abschnitt Buildscript-> Repositorys heruntergeladen werden. Buildscript-Block, wird zuerst ausgeführt (Build-System-Vorbereitungsphase), bevor die Ausführung der Build-Task wie Quellkompilierung usw. gestartet wird
Raja Nagendra Kumar
4
buildscriptist einfach eine Abhängigkeit für Ihr Build-Skript
Slier
3
Buildscript ist devDependencies in node.js, Top-Level = Abhängigkeiten.
Jacob
67

Ich schätze Peters Antwort ... aber es war mir nicht sofort klar, was der Rest des Build-Skripts bedeutete, wie in der Antwort und in der Dokumentation hervorgehoben.

Normalerweise wird die Verwendung abhängiger Funktionen für das Java-Programm oder ein anderes Programm verwendet, das Sie möglicherweise schreiben. Bringing in Spring sagen, ist nicht im Build-Skript zu verwenden, sondern im Java-Programm. Durch buildscriptdas Einfügen in den Abschluss wird sichergestellt, dass die Abhängigkeiten für die Verwendung innerhalb des Gradle-Builds selbst verfügbar sind. Nicht das Ausgabeprogramm.

Daniel Gerson
quelle
8

Der Konfigurationsabschnitt "Buildscript" bezieht sich auf Gradle selbst (dh Änderungen daran, wie Gradle den Build ausführen kann). Daher enthält dieser Abschnitt normalerweise das Android Gradle-Plugin.

Maulik Baraiya
quelle
2

Es ist ein bisschen hoch, aber die Hoffnung hilft.

Für mich begann sich eine klare Unterscheidung zu formen, sobald ich zu verstehen begann, was ein Baustein , eine Methode und eine Aufgabe ist. Wie die Syntax aussieht, wie Sie sie konfigurieren können usw. Ich schlage vor, dass Sie all dies durchgehen. Danach können Sie beginnen, diese Syntax zu verstehen.

Dann ist es sehr wichtig zu wissen, welchen Typ das Objekt build.gradle (eine Instanz der Project-Klasse) hat, um zu wissen, was Sie in einer build.gradle-Datei haben können. Das würde antworten, woher dieses 'buildScript' und andere kommen. Und um Ihre Fähigkeiten / Features (sagen wir Android) zu erweitern, sehen Sie, wie Plugins helfen können.

Last but not least gibt es hier ein sehr gutes Tutorial , das sich mit Schließungen befasst, Delegierten, die die Konzepte sind, die für das Verständnis des Skripts wesentlich sind.

stdout
quelle
1

Ein bisschen mehr Erklärung durch Demonstration der Android-Gradle-Datei der obersten Ebene.

buildscript {
    // this is where we are going to find the libraries defined in "dependencies block" at below
    repositories {
        google()
        jcenter()
        maven { url 'https://dl.bintray.com/kotlin/kotlin-eap' }
    }

    // everything listed in the dependencies is actually a plugin, which we'll do "apply plugin" in our module level gradle file.
    dependencies {
        classpath 'com.android.tools.build:gradle:3.4.2' // this is android gradle plugin
        classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" // kotlin gradle plugin
    }
}

Gradle-Datei auf Modulebene

apply plugin: 'com.android.application'
apply plugin: 'kotlin-android'
apply plugin: 'kotlin-android-extensions'

Was ist "Plugin"? Es sind nur Java-Klassen, die die Plugin-Schnittstelle implementieren. Unter der Schnittstelle gibt es eine Methode "anwenden", um mehrere Aufgabenobjekte mit unterschiedlichen Namen hinzuzufügen. Aufgabe ist eine Klasse, in der wir den Workflow implementieren können. Die Erstellungsaufgabe besteht beispielsweise aus dem Ablauf des Erstellens der App.

Was macht Buildscript? Es definiert, wo die Plugins zu finden sind. Was macht das Plugin? Es umfasst mehrere Aufgaben. Was macht die Aufgabe? Es liefert uns den Bau, die Installation, die Flusen usw.

Mein Verständnis könnte falsch sein. Bitte zögern Sie nicht, mich zu korrigieren, wenn Sie feststellen, dass etwas irreführend ist.

KunYu Tsai
quelle