Wie kann ich ein Gradle-Skript in ein anderes importieren?

96

Ich habe ein komplexes Gradle-Skript, das eine Vielzahl von Funktionen zum Erstellen und Bereitstellen einer Reihe von Netbeans-Projekten in einer Reihe von Umgebungen zusammenfasst.

Das Skript funktioniert sehr gut, aber im Wesentlichen wird alles über ein halbes Dutzend Karten konfiguriert, die Projekt- und Umgebungsinformationen enthalten.

Ich möchte die Aufgaben in eine andere Datei abstrahieren, damit ich meine Maps einfach in einer einfachen Build-Datei definieren und die Aufgaben aus der anderen Datei importieren kann. Auf diese Weise kann ich dieselben Kernaufgaben für eine Reihe von Projekten verwenden und diese Projekte mit einem einfachen Satz von Karten konfigurieren.

Kann mir jemand sagen, wie ich eine Gradle-Datei in eine andere importieren kann, ähnlich wie bei Ant? Ich habe Gradles Dokumente bisher ohne Erfolg durchsucht.

Zusätzliche Information

Nach Toms Antwort unten dachte ich, ich würde versuchen, genau zu klären, was ich meine.

Grundsätzlich habe ich ein Gradle-Skript, das eine Reihe von Teilprojekten ausführt. Die Teilprojekte sind jedoch alle Netbeans-Projekte und werden mit eigenen Ant-Build-Skripten geliefert, sodass ich Aufgaben in Gradle habe, um jedes dieser Projekte aufzurufen.

Mein Problem ist, dass ich oben in der Datei eine Konfiguration habe, wie zum Beispiel:

projects = [
    [name:"MySubproject1", shortname: "sub1", env:"mainEnv", cvs_module="mod1"],
    [name:"MySubproject2", shortname: "sub2", env:"altEnv", cvs_module="mod2"]
]

Ich generiere dann Aufgaben wie:

projects.each({
    task "checkout_$it.shortname" << {
         // Code to for example check module out from cvs using config from 'it'.
    }
})

Ich habe viele dieser Arten von Snippets zur Aufgabengenerierung, und alle sind generisch - sie hängen vollständig von der Konfiguration in der Projektliste ab.

Ich möchte also eine Möglichkeit, dies in ein separates Skript einzufügen und auf folgende Weise zu importieren:

projects = [
    [name:"MySubproject1", shortname: "sub1", env:"mainEnv", cvs_module="mod1"],
    [name:"MySubproject2", shortname: "sub2", env:"altEnv", cvs_module="mod2"]
]

import("tasks.gradle") // This will import and run the script so that all tasks are generated for the projects given above.

In diesem Beispiel enthält task.gradle den gesamten generischen Code zur Aufgabengenerierung und wird für die in der Hauptdatei build.gradle definierten Projekte ausgeführt. Auf diese Weise ist task.gradle eine Datei, die von allen großen Projekten verwendet werden kann, die aus einer Reihe von Unterprojekten mit Netbeans Ant Build-Dateien bestehen.

Anthony Roy
quelle
3
Betrachten Sie das Konstrukt "apply from: 'other.gradle'", um externe Deklarationen zu importieren. (Siehe "12.4. Konfigurieren des Projekts mit einem externen Build-Skript" hier gradle.org/0.9-preview-1/docs/userguide/… )
Petr Gladkikh
@PetrGladkikh apply fromführt die externen Aufgaben sofort aus. Dies ist in der Ausführungslogik möglicherweise nicht vorzuziehen (dh ich möchte die Aufgaben ausführen, wenn ich möchte, nicht sofort).
IgorGanapolsky
Diese Aussage im obigen Kommentar ist nicht wahr : apply fromFührt die externen Aufgaben sofort aus. Lass dich nicht irreführen. Externe Aufgaben werden konfiguriert und nicht ausgeführt.
Jarekczek

Antworten:

17

Die Antwort auf die Frage stellte sich im Plugins-System heraus, wo Sie die gewünschte Funktionalität in einer Reihe von Plugins hinzufügen können, bei denen es sich um groovige Dateien im Verzeichnis handeln kann buildSrc/src/main/groovy. Plugins können auch als Jar gebündelt werden, obwohl ich dies nicht ausprobiert habe.

Details hier: Benutzerdefinierte Plugins

Anthony Roy
quelle
Nur damit Sie wissen, dass der Link unterbrochen ist - hier ist ein Update gradle.org/docs/current/userguide/…
JARC
4

Nun, es ist schwer zu sagen, was Ihnen am besten dient, ohne Ihre Build-Datei tatsächlich zu sehen.

Ich könnte davon ausgehen, dass das Einrichten Ihrer Umgebung als Multiprojekt-Build Ihnen die Abstraktion bietet, nach der Sie suchen.

In Ihrem Projektstamm build.gradledefinieren Sie alle Ihre domänenspezifischen Dinge sowie die Dinge, die für alle Ihre Teilprojekte gelten:

repositories {
    add(new org.apache.ivy.plugins.resolver.FileSystemResolver()) {
        name = 'destRepo'
        addIvyPattern( file( project.properties['repo.dest.dir']).absolutePath + '/[organisation]/[module]/ivys/ivy(-[revision]).xml')
        addArtifactPattern( file( project.properties['repo.dest.dir']).absolutePath + '/[organisation]/[module]/[type]s/[artifact](-[revision]).[ext]')
        descriptor = 'optional'
        checkmodified = true
    }
    ...
}
...
subprojects {
    sourceCompatibility = 1.5
    targetCompatibility = 1.5
    group = 'my.group'
    version = '1.0'
    uploadArchives {
        uploadDescriptor = true
        repositories {
            add rootProject.repositories.destRepo
        }
    }
    apply{ type my.group.gradle.api.plugins.MyPlugin }
    ...
}

dependsOnChildren()

Das Projektstammverzeichnis enthält möglicherweise auch eine gradle.propertiesDatei, in der Sie die von Ihren Projekten verwendeten Eigenschaften definieren:

buildDirName=staging
repo.dest.dir=/var/repo
...

Dann settings.gradleverweisen Sie in einer zusätzlichen Datei aus Ihrem Projektstamm mit dem Namen tatsächlich auf Ihre Teilprojekte:

include 'my-first-component',
        'my-second-component'
...
project(':my-first-component').projectDir = new File(rootDir, 'path/to/first/component')
project(':my-second-component').projectDir = new File(rootDir, 'path/to/second/component')
...

Jedes Unterprojektverzeichnis enthält eine build.gradleDatei, die nur die unterprojektspezifischen Inhalte enthält.

gradleUnabhängig davon, ob Sie von Ihrem Projektstamm- oder Unterprojektverzeichnis aus aufrufen , berücksichtigt gradle automatisch alle Ihre Definitionen, die in den verschiedenen Dateien vorgenommen wurden.

Beachten Sie auch, dass keine Kompilierungsaufgabe für Ihr Projektstammverzeichnis ausgeführt wird, solange Sie kein Plugin über das Standard-Plugin auf Stammebene hinaus laden.

Tom
quelle
1
Vielen Dank, dass Sie sich die Zeit genommen haben, um zu antworten. Es sind keine Unterprojekte, mit denen ich Probleme habe, sondern das Erstellen einer 'Bibliothek' mit allgemeinen Aufgaben. Ich habe meine ursprüngliche Frage mit weiteren Informationen und Codefragmenten bearbeitet, um die Dinge klarer zu machen.
Anthony Roy
1
Anstatt den Import ("task.gradle") aus Ihrem Beispiel durchzuführen, wird im Abschnitt "subprojects {}" der generische Code zur Aufgabengenerierung angegeben, der von allen Ihren Unterprojekten verwendet wird. Dies sollte die gleiche Abstraktion liefern, nach der Sie suchen!?
Tom
Ist das Ivy Plugin hier wirklich notwendig? Kann Gradle nicht alleine verwendet werden?
IgorGanapolsky