Eine benutzerdefinierte Aufgabe in Gradle

Eine benutzerdefinierte Aufgabe in Gradle

1. Überblick

In diesem Artikel wird erläutert, wiecreate a custom task in Gradle. Wir zeigen eine neue Aufgabendefinition mithilfe eines Build-Skripts oder eines benutzerdefinierten Aufgabentyps.

Die Einführung in den Gradle finden Sie unterthis article. Es enthält die Grundlagen von Gradle und - was für diesen Artikel am wichtigsten ist - die Einführung in Gradle-Aufgaben.

2. Benutzerdefinierte Aufgabendefinition inbuild.gradle

Um eine einfache Gradle-Aufgabe zu erstellen, müssen wir ihre Definition zu unsererbuild.gradle-Datei hinzufügen:

task welcome {
    doLast {
        println 'Welcome in the example!'
    }
}

Das Hauptziel der obigen Aufgabe besteht darin, nur den Text „Willkommen im Beispiel!“ Zu drucken. Wir können überprüfen, ob diesetask is available sind, indem wir den Befehlgradle tasks –all ausführen:

gradle tasks --all

Die Aufgabe befindet sich in der Liste unter der GruppeOther tasks:

Other tasks
-----------
welcome

Es kann wie jede andere Gradle-Aufgabe ausgeführt werden:

gradle welcome

Die Ausgabe ist wie erwartet - das "Willkommen im Beispiel!" Botschaft.

Anmerkung: Wenn die Option–all nicht aktiviert ist, werden Aufgaben, die zur Kategorie "Andere" gehören, nicht angezeigt. Die benutzerdefinierte Gradle-Aufgabe kann einer anderen Gruppe als "Andere" angehören und eine Beschreibung enthalten.

3. Gruppe und Beschreibung festlegen

Manchmal ist es praktisch, Aufgaben nach Funktionen zu gruppieren, damit sie unter einer Kategorie angezeigt werden. Wir können schnellsetgroup for our custom tasks, just by defining a group property:

task welcome {
    group 'Sample category'
    doLast {
        println 'Welcome on the example!'
    }
}

Wenn wir nun den Befehl Gradle ausführen, um alle verfügbaren Aufgaben aufzulisten (die Option–allwird nicht mehr benötigt), wird unsere Aufgabe unter der neuen Gruppe angezeigt:

Sample category tasks
---------------------
welcome

Es ist jedoch auch für andere von Vorteil zu sehen, wofür eine Aufgabe verantwortlich ist. Wir könnencreate a description, die kurze Informationen enthalten:

task welcome {
    group 'Sample category'
    description 'Tasks which shows a welcome message'
    doLast {
        println 'Welcome in the example!'
    }
}

Wenn wir eine Liste der verfügbaren Aufgaben drucken, sieht die Ausgabe folgendermaßen aus:

Sample category tasks
---------------------
welcome - Tasks which shows a welcome message

Diese Art der Aufgabendefinition heißtad-hoc definition.

In Zukunft ist es vorteilhaft, eine anpassbare Aufgabe zu erstellen, deren Definition wiederverwendet werden kann. Wir werden erläutern, wie Sie eine Aufgabe aus einem Typ erstellen und wie Sie den Benutzern dieser Aufgabe einige Anpassungen zur Verfügung stellen.

4. Definieren Sie den Gradle-Aufgabentyp inbuild.gradle

Die oben genannte "Willkommens" -Aufgabe kann nicht angepasst werden und ist daher in den meisten Fällen nicht sehr nützlich. Wir können es ausführen, aber wenn wir es in einem anderen Projekt (oder Teilprojekt) benötigen, müssen wir seine Definition kopieren und einfügen.

Wir können schnellenable customization of the task by creating a task type. Lediglich ein Aufgabentyp ist im Build-Skript definiert:

class PrintToolVersionTask extends DefaultTask {
    String tool

    @TaskAction
    void printToolVersion() {
        switch (tool) {
            case 'java':
                println System.getProperty("java.version")
                break
            case 'groovy':
                println GroovySystem.version
                break
            default:
                throw new IllegalArgumentException("Unknown tool")
        }
    }
}

Acustom task type is a simple Groovy class which extends DefaultTask - die Klasse, die die Implementierung von Standardaufgaben definiert. Es gibt andere Aufgabentypen, von denen wir erweitern können, aber in den meisten Fällen ist die KlasseDefaultTaskdie geeignete Wahl.

PrintToolVersionTasktask contains tool property which can be customized by instances dieser Aufgabe:

String tool

Wir können so viele Eigenschaften hinzufügen, wie wir möchten - denken Sie daran, dass es sich nur um ein einfaches Groovy-Klassenfeld handelt.

Zusätzlich enthält esmethod annotated with @TaskAction. It defines what this task is doing. In diesem einfachen Beispiel wird die Version von installiertem Java oder Groovy gedruckt - abhängig vom angegebenen Parameterwert.

Um eine benutzerdefinierte Aufgabe basierend auf dem erstellten Aufgabentyp auszuführen, müssencreate a new task instance of this type:

task printJavaVersion(type : PrintToolVersionTask) {
    tool 'java'
}

Die wichtigsten Teile sind:

  • Unsere Aufgabe ist einPrintToolVersionTask-Typ, alsowhen executed it’ll trigger the action defined in the method annotated with @TaskAction

  • Wir haben einen benutzerdefinierten Werkzeugeigenschaftswert (java) hinzugefügt, der vonPrintToolVersionTask verwendet wird

Wenn wir den obigen Task ausführen, sieht die Ausgabe wie erwartet aus (abhängig von der installierten Java-Version):

> Task :printJavaVersion
9.0.1

Erstellen wir nun eine Aufgabe, die die installierte Version von Groovy druckt:

task printGroovyVersion(type : PrintToolVersionTask) {
    tool 'groovy'
}

Es verwendet denselben Aufgabentyp wie zuvor definiert, hat jedoch einen anderen Tool-Eigenschaftswert. Wenn wir diese Aufgabe ausführen, wird die Groovy-Version gedruckt:

> Task :printGroovyVersion
2.4.12

If we have not too many custom tasks, then we can define them directly in the build.gradle file (wie oben). Wenn es jedoch mehr als einige gibt, ist unserebuild.-Sgradle-Datei schwer zu lesen und zu verstehen.

Zum Glück bietet Gradle einige Lösungen dafür.

5. Definieren Sie den Aufgabentyp im OrdnerbuildSrc

Wir könnendefine task types in the buildSrc folder which is located at the root project level. Gradle kompiliert alles, was sich darin befindet, und fügt dem Klassenpfad Typen hinzu, damit unser Build-Skript es verwenden kann.

Unser Aufgabentyp, den wir zuvor definiert haben (PrintToolVersionTask), kann inbuildSrc/src/main/groovy/com/example/PrintToolVersionTask.groovy verschoben werden. Wir müssen nur einigeimports from Gradle API zu einer verschobenen Klasse. hinzufügen

Wir können eine unbegrenzte Anzahl von Aufgabentypen im OrdnerbuildSrcdefinieren. Es ist einfacher zu pflegen, zu lesen und die Aufgabentypdeklaration befindet sich nicht an derselben Stelle wie die Aufgabeninstanziierung.

Wir können diese Typen genauso verwenden wie Typen, die direkt im Build-Skript definiert sind. Wir müssen uns nur daran erinnern, entsprechende Importe hinzuzufügen.

6. Definieren Sie den Aufgabentyp im Plugin

In einem benutzerdefinierten Gradle-Plugin können benutzerdefinierte Aufgabentypen definiert werden. Weitere Informationen finden Sie unterthis article, in dem beschrieben wird, wie Sie ein benutzerdefiniertes Gradle-Plugin definieren.

  • build.gradle Datei

  • buildSrc Ordner wie andere Groovy-Klassen

Diese benutzerdefinierten Aufgaben stehen für unseren Build zur Verfügung, wenn wir eine Abhängigkeit von diesem Plugin definieren. Bitte beachten Sie, dass auch Ad-hoc-Aufgaben verfügbar sind - nicht nur benutzerdefinierte Aufgabentypen.

7. Fazit

In diesem Lernprogramm wurde erläutert, wie Sie in Gradle eine benutzerdefinierte Aufgabe erstellen. Es gibt viele Plugins, die Sie in Ihrerbuild.gradle-Datei verwenden können und die viele benutzerdefinierte Aufgabentypen enthalten, die Sie benötigen.

Wie immer sind Codefragmenteover on Github verfügbar.