2010-02-15 17 views
76

Ich habe ein komplexes Gradle-Skript, das eine Fülle von Funktionen zum Erstellen und Bereitstellen einer Reihe von Netbeans-Projekten in einer Reihe von Umgebungen bereitstellt.Wie kann ich ein Gradle-Skript in ein anderes importieren?

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

Ich möchte die Aufgaben in eine andere Datei abstrahieren, so dass ich einfach meine Karten in einer einfachen Build-Datei definieren und die Aufgaben aus der anderen Datei importieren kann. Auf diese Weise kann ich die gleichen Kernaufgaben für eine Anzahl 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 Unterlagen bis jetzt vergeblich durchsucht.

Zusätzliche Informationen

Nachdem Tom Antwort unten, ich dachte, ich würde versuchen, und klären, was genau ich meine.

Grundsätzlich habe ich ein Gradle-Skript, das eine Reihe von Teilprojekten ausführt. Die Teilprojekte sind jedoch alle Netbeans-Projekte und kommen mit ihren eigenen Ameisen-Build-Skripten, so dass ich Aufgaben habe, um jede davon aufzurufen.

Mein Problem ist, dass ich eine Konfiguration am Anfang der Datei haben, wie zum Beispiel:

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

ich dann Aufgaben erzeugen wie:

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

Ich habe viele dieser Art von Task Generations Snippets, und alle von ihnen sind generisch - sie hängen vollständig von der Konfiguration in der Projektliste ab.

Also, was ich will, ist eine Möglichkeit, dies in einem separaten Skript zu setzen und es in der folgenden Art und 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. 

So in diesem Beispiel wird tasks.gradle alle die allgemeine Aufgabe Generation hat Code ein und wird für die Projekte ausgeführt, die in der Hauptdatei build.gradle definiert sind. Auf diese Weise ist tasks.gradle eine Datei, die von allen großen Projekten verwendet werden kann, die aus einer Reihe von Unterprojekten mit Netbeans-Ameisen-Build-Dateien bestehen.

+3

Betrachten. (Siehe "12.4. Konfigurieren des Projekts mit einem externen Buildskript" hier http://digle.org/0.9-preview-1/docs/userguide/tutorial_this_and_that.html#sec:configuring_using_external_script) –

+0

@PetrGladkikh 'apply from' wird sofort ausgeführt die externen Aufgaben. Dies ist möglicherweise in der Ausführungslogik nicht bevorzugt (d. H. Ich möchte die Aufgaben ausführen, wenn ich möchte, nicht sofort). –

+0

Diese Aussage im obigen Kommentar ist ** nicht wahr **: 'apply from' führt sofort die externen Aufgaben aus. Lass dich nicht irreführen. Externe Aufgaben werden konfiguriert, nicht ausgeführt. – Jarekczek

Antwort

12

Die Antwort auf die Frage stellte sich heraus, in dem Plug-Ins-System zu sein, in dem Sie die gewünschte Funktionalität in einer Reihe von Plugins hinzufügen können, die in den starken Dateien sein kann sich das Verzeichnis buildSrc/src/main/groovy. Plugins können auch als Jar gebündelt werden, obwohl ich das nicht versucht habe.

Einzelheiten hier: ": 'other.gradle' von apply" konstruieren externe Erklärungen importieren Custom Plugins

+0

Nur damit Sie wissen, dass der Link kaputt ist - hier ist ein Update http://gradle.org/docs/current/userguide/userguide_single.html#sec:configuring_using_external_script – JamesC

+0

Plugin-Link: http://gradle.org/docs/current/ userguide/userguide_single.html # benutzerdefinierte_plugins – JamesC

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 Multi-Projekt-Build Ihnen die Abstraktion bieten soll, nach der Sie suchen.

in Ihrem Projekt root build.gradle Sie alle spezifischen Sachen Ihrer Domain sowie die Dinge definieren, die 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 Projekt Stammverzeichnis kann auch enthalten eine gradle.properties Datei, in der Sie festlegen, Eigenschaften von Ihren Projekten verwendet:

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

dann in einer zusätzlichen Datei von Ihrem Projektstamm namens settings.gradle Sie weisen 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 Teilprojektverzeichnis enthält eine Datei build.gradle nur das Teilprojekt spezifische Dinge enthält.

Egal, ob Sie gradle von Ihrem Projekt-Stamm- oder Unterprojektverzeichnis aufrufen, gradle berücksichtigt automatisch alle Ihre Definitionen in den verschiedenen Dateien.

Beachten Sie auch, dass keine Compile-Aufgabe für Ihr Projekt-Root ausgeführt wird, solange Sie kein Plugin über das Standard-Plugin auf der Stammebene laden.

+1

Danke, dass du dir die Zeit genommen hast zu antworten. Es sind keine Unterprojekte, mit denen ich Probleme habe, sondern eher eine "Bibliothek" mit häufigen Aufgaben. Ich habe meine ursprüngliche Frage mit mehr Informationen und Code-Schnipseln bearbeitet, um die Dinge klarer zu machen. –

+1

Anstatt also den Import ("tasks.gradle") aus Ihrer Beispieldatei auszuführen, müssen Sie im Abschnitt Unterprojekte {} den Generierungscode für generische Aufgaben angeben, der von allen Ihren Unterprojekten verwendet wird. Dies sollte die gleiche Abstraktion bieten, nach der Sie suchen !? – Tom

+0

Ist Ivy Plugin wirklich notwendig hier? Kann Gradle nicht alleine benutzt werden? –

Verwandte Themen