Wie / wann werden Gradle-Wrapper-Dateien generiert?

212

Ich versuche zu verstehen, wie der Gradle Wrapper funktioniert. In vielen Quell-Repos sehe ich die folgende Struktur:

projectRoot/
    src/
    build.gradle
    gradle.properties
    settings.gradle
    gradlew
    gradlew.bat
    gradle/
        wrapper/
            gradle-wrapper.jar
            gradle-wrapper.properties

Meine Fragen:

  1. Wie / wann generiert man gradlew/ gradlew.bat? Sollten Sie sie nur einmal generieren, wenn das Projekt zum ersten Mal erstellt wird? Generieren Sie sie jedes Mal, wenn Sie Änderungen festschreiben / verschieben? Und wie entstehen sie?
  2. Gleiche Frage oben, aber für die gradle/wrapper/*Dateien ( gradle-wrapper.jarund gradle-wrapper.properties)?
  3. Manchmal sehe ich andere *.gradleDateien im Projektverzeichnis gradle. Was sind diese zusätzlichen Gradle-Dateien und was repräsentieren / tun sie? Benutzerdefinierte Plugins?
  4. Was ist der Unterschied zwischen den Eigenschaften und den Eigenschaften, die settings.gradleim Inneren definiert werden sollten gradle.properties?
smeeb
quelle

Antworten:

250
  1. Sie generieren es einmal und erneut, wenn Sie die im Projekt verwendete Version von Gradle ändern möchten. Es ist nicht nötig, so oft zu generieren. Hier sind die Dokumente. Fügen Sie einfach eine wrapperAufgabe zur build.gradleDatei hinzu und führen Sie diese Aufgabe aus, um die Wrapper-Struktur zu erhalten.

    Beachten Sie, dass Gradle installiert sein muss , um einen Wrapper zu generieren. Das großartige Tool zum Verwalten von G-Ökosystem-Artefakten ist SDKMAN! . Fügen Sie der build.gradleDatei den folgenden Code hinzu, um einen Gradle-Wrapper zu generieren :

    task wrapper(type: Wrapper) {
       gradleVersion = '2.0' //version required
    }
    

    und Renn:

    gradle wrapper
    

    Aufgabe. Fügen Sie die resultierenden Dateien zu SCM hinzu (z. B. git), und ab sofort haben alle Entwickler dieselbe Version von Gradle, wenn Sie Gradle Wrapper verwenden.

    Mit Gradle 2.4 (oder höher) können Sie einen Wrapper einrichten, ohne eine spezielle Aufgabe hinzuzufügen:

    gradle wrapper --gradle-version 2.3
    

    oder

    gradle wrapper --gradle-distribution-url https://myEnterpriseRepository:7070/gradle/distributions/gradle-2.3-bin.zip
    

    Alle Details finden Sie hier

Von Gradle 3.1 --distribution-typekann auch die Option verwendet werden. Die Optionen sind binär und alle und bin . Alle enthalten zusätzlich Quellcode und Dokumentation. Alles ist auch besser, wenn IDE verwendet wird, sodass der Editor besser funktioniert. Nachteil ist, dass der Build möglicherweise länger dauert (mehr Daten müssen heruntergeladen werden, was auf dem CI-Server sinnlos ist) und mehr Speicherplatz benötigt.

  1. Dies sind Gradle Wrapper-Dateien. Sie müssen sie einmal generieren (für eine bestimmte Version) und zur Versionskontrolle hinzufügen. Wenn Sie die Version von Gradle Wrapper ändern müssen, ändern Sie die Version in build.gradlesiehe (1.) und generieren Sie die Dateien neu.

  2. Geben Sie ein detailliertes Beispiel. Eine solche Datei kann mehrere Zwecke haben: Projekt mit mehreren Modulen, Trennung der Verantwortlichkeiten, leicht modifiziertes Skript usw.

  3. settings.gradleist eher für die Struktur des Projekts verantwortlich (Module, Namen usw.), während gradle.propertieses für die externen Details des Projekts und Gradle (Version, Befehlszeilenargumente -XX, Eigenschaften usw.) verwendet wird.

Opal
quelle
Vielen Dank an @Opal (+1) - um Ihnen ein konkretes Beispiel für # 3 zu geben, siehe Netflix-Eureka . Was sind diese Gradle-Dateien?!?
Smeeb
Ok, ich sehe es. Soweit ich sehe, haben Entwickler von Netflix nur ein großes build.gradleSkript in mehrere kürzere Skripte unterteilt und sich einem bestimmten Zweck gewidmet. Wie Sie das Skript unter gradle dir a auf die Hauptdatei anwenden können build.gradle, sehen Sie: github.com/Netflix/eureka/blob/master/build.gradle . Wo Sie solche Module platzieren, ist Ihre Wahl. Das ist alles im Allgemeinen. Wenn Sie mit der Antwort zufrieden sind, akzeptieren Sie bitte die Antwort :)
Opal
1
Eine andere nützliche Befehlszeilenoption ist --distribution-typez. B.gradle wrapper --gradle-version 4.3.1 --distribution-type ALL
heenenee
1
Danke @heenenee, werde es meiner Antwort hinzufügen.
Opal
Tipp: Android Studio hat einen Gradle im Installationsordner.
TWiStErRob
29

Gradle Wrapper generieren

Projekt Build Gradle

// Top-level build file where you can add configuration options common to all sub-projects/modules.

// Running 'gradle wrapper' will generate gradlew - Getting gradle wrapper working and using it will save you a lot of pain.
task wrapper(type: Wrapper) {
    gradleVersion = '2.2' 
}

// Look Google doesn't use Maven Central, they use jcenter now.
buildscript {
    repositories {
        jcenter()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:1.0.1'

        // NOTE: Do not place your application dependencies here; they belong
        // in the individual module build.gradle files
    }
}

allprojects {
    repositories {
        jcenter()
    }
}

Dann an der Kommandozeile ausführen

gradle wrapper

Wenn Sie gradle auf Ihrem System vermissen, installieren Sie es oder das oben genannte funktioniert nicht. Auf einem Mac ist es am besten, über Homebrew zu installieren.

brew install gradle

gradlewVerwenden Sie Ihren Systemgradle nicht, nachdem Sie die Wrapper-Task erfolgreich ausgeführt und generiert haben. Es erspart Ihnen viele Kopfschmerzen.

./gradlew assemble

Was ist mit dem oben gezeigten Gradle-Plugin?

com.android.tools.build:gradle:1.0.1

Sie sollten die Version auf den neuesten Stand bringen und die Tools-Seite überprüfen und die Version entsprechend bearbeiten.

Sehen Sie, was Android Studio generiert

Das Hinzufügen von gradle und dem neuesten Android Studio hat das Projektlayout dramatisch verändert. Wenn Sie ein älteres Projekt haben, empfehle ich dringend, ein sauberes mit dem neuesten Android Studio zu erstellen und zu sehen, was Google als Standardprojekt betrachtet.

Android Studio verfügt über Funktionen zum Importieren älterer Projekte, die ebenfalls hilfreich sein können.

Cameron Lowell Palmer
quelle
gradleVersion = '2.2'in taskWrapperkann jede Version verwenden, die ich zum Generieren des Wrappers wünsche, richtig? Muss nicht die neueste Version von gradle sein?
Raffian
1
Ich nehme an, Sie können in die 2er-Reihe von Gradle zurückkehren. Ich bin mir vor 2.x überhaupt nicht sicher, aber nein, es muss nicht der absolut neuesten Version folgen.
Cameron Lowell Palmer
18

Ab Gradle 2.4 können Sie gradle wrapper --gradle-version X.Xeine bestimmte Version des Gradle-Wrappers konfigurieren, ohne Ihrer build.gradleDatei Aufgaben hinzuzufügen . Wenn Sie den Wrapper das nächste Mal verwenden, wird die entsprechende Gradle-Distribution heruntergeladen.

Craig Trader
quelle
10

Wenn Sie gradle mit Quellcode und Dokumenten herunterladen möchten, entspricht die in gradle-wrapper.properites konfigurierte Standardverteilungs-URL nicht Ihren Anforderungen. Sie lautet https://services.gradle.org/distributions/gradle-2.10-bin.zip . nicht https://services.gradle.org/distributions/gradle-2.10-all.zip. Diese vollständige URL wird von einer IDE wie Android Studio vorgeschlagen. Wenn Sie den vollständigen Gradle herunterladen möchten, können Sie die Wrapper-Aufgabe wie folgt konfigurieren ::

task wrapper(type: Wrapper) {
    gradleVersion = '2.13'
    distributionUrl = distributionUrl.replace("bin", "all")
}
Geng Jiawen
quelle
1
Bei neueren Gradle-Builds (nicht sicher, welche genau) - anstatt die URL manuell neu zu schreiben, ist es wahrscheinlich am besten, den eingebauten Befehl in derselben Schließung zu verwenden: DistributionType = Wrapper.DistributionType.ALL
Dave Birch
6

Dies ist der Befehl, mit dem Gradle angewiesen wird, den Wrapper so zu aktualisieren, dass er die Verteilungsversionen von Bibliotheken mit Quellcode abruft:

./gradlew wrapper --gradle-version <version> --distribution-type all

Wenn Sie den Verteilungstyp mit "all" angeben, wird sichergestellt, dass Gradle Quelldateien zur Verwendung durch Ihre Entwicklungsumgebung herunterlädt.

Vorteile :

  • IDEs haben sofortigen Zugriff auf den Quellcode. Beispielsweise fordert Intellij IDEA Sie nicht auf, Ihre Build-Skripte so zu aktualisieren, dass sie die Quelldistribution enthalten (da dieser Befehl dies bereits getan hat).

Nachteile :

  • Längerer / größerer Erstellungsprozess, da Quellcode heruntergeladen wird. Dies ist eine Verschwendung von Zeit / Raum auf einem Build- oder CI-Server, auf dem der Quellcode nicht erforderlich ist.

Bitte kommentieren Sie oder geben Sie eine andere Antwort, wenn Sie eine Befehlszeilenoption kennen, mit der Gradle angewiesen wird, keine Quellen auf einen Build-Server herunterzuladen.

Geschoren
quelle
1
Sind Sie sicher, dass es bei dieser Einstellung um Bibliotheken geht? Die offiziellen Dokumente sagen etwas anderes und beziehen sich nur auf den Wrapper selbst: "Der Typ der Gradle-Distribution, die vom Wrapper verwendet werden soll." docs.gradle.org/current/dsl/…
Thorsten Schöning
2
  1. Sie werden sie einmal generieren, aber aktualisieren, wenn Sie eine neue Funktion oder etwas von einem Plugin benötigen, das wiederum eine neuere Gradle-Version benötigt.

    Einfachste Möglichkeit zum Aktualisieren: Ab Gradle 2.2 können Sie einfach die vollständige oder binäre Gradle-Distribution herunterladen und extrahieren und Folgendes ausführen:

    $ <pathToExpandedZip>/bin/gradle wrapper
    

    Sie müssen keine Aufgabe definieren, obwohl Sie wahrscheinlich eine Art build.gradleDatei benötigen .

    Dadurch werden der gradlewund gradlew.bat-Wrapper sowie der und aktualisiert gradle/wrapper/gradle-wrapper.propertiesund erstellt gradle-wrapper.jar, um die aktuelle Version von gradle bereitzustellen.

  2. Das ist alles Teil des Wrappers.

  3. Einige build.gradleDateien verweisen auf andere Dateien oder Dateien in Unterverzeichnissen, bei denen es sich um Unterprojekte oder Module handelt. Es wird etwas kompliziert, aber wenn Sie ein Projekt haben, benötigen Sie im Grunde die eine Datei.

  4. settings.gradleBehandelt Projekt-, Modul- und andere Arten von Namen und Einstellungen, gradle.propertieskonfiguriert wiederverwendbare Variablen für Ihre Gradle-Dateien, wenn Sie möchten, und Sie glauben, dass sie auf diese Weise klarer werden.

Dlamblin
quelle
2

Versuchen Sie es weiter unten, da die in gradle integrierten Aufgaben in 4.8 veraltet sind

wrapper {
   gradleVersion = '2.0' //version required
}

und Renn

gradle wrapper
Zeichner
quelle