Ich habe ein Gradle-Build-Skript ( build.gradle
), in dem ich einige Aufgaben erstellt habe. Diese Aufgaben bestehen hauptsächlich aus Methodenaufrufen. Die aufgerufenen Methoden befinden sich auch im Build-Skript.
Hier ist die Situation:
Ich erstelle eine ganze Reihe von Build-Skripten, die unterschiedliche Aufgaben enthalten, aber dieselben Methoden wie das ursprüngliche Skript verwenden. Daher möchte ich diese "allgemeinen Methoden" auf irgendeine Weise extrahieren, damit ich sie problemlos wiederverwenden kann, anstatt sie für jedes neue Skript zu kopieren, das ich erstelle.
Wenn Gradle PHP wäre, wäre Folgendes ideal:
//script content
...
require("common-methods.gradle");
...
//more script content
Aber das ist natürlich nicht möglich. Oder ist es?
Wie kann ich dieses Ergebnis erzielen? Was ist die bestmögliche Methode, um dies zu tun? Ich habe die Gradle-Dokumentation bereits gelesen, kann aber anscheinend nicht feststellen, welche Methode dafür am einfachsten und am besten geeignet ist.
Danke im Voraus!
AKTUALISIEREN:
Ich habe es geschafft, die Methoden in eine andere Datei zu extrahieren
(mit apply from: 'common-methods.gradle'
),
Die Struktur ist also wie folgt:
parent/
/build.gradle // The original build script
/common-methods.gradle // The extracted methods
/gradle.properties // Properties used by the build script
Nachdem build.gradle
ich eine Aufgabe von ausgeführt habe , bin ich auf ein neues Problem gestoßen: Anscheinend werden Methoden nicht erkannt, wenn sie sich in befinden common-methods.gradle
.
Irgendwelche Ideen, wie man das behebt?
quelle
timestamp()
odercurrentWorkingDirectory()
Methoden alstask
-s zu erstellen (zum Beispiel). Dienstprogrammfunktionen und ähnliche Dinge sind nominell skalar - Sie wären keine Aufgaben, außer dass die Wiederverwendung von Code, die in Gradle und den meisten Build-Systemen integriert ist, Einschränkungen unterliegt. Ich mag die TROCKENE Welt, in der ich EINMAL etwas machen und es wiederverwenden kann. Wenn ich das Beispiel von @Pieter VDE erweitere, verwende ich auch ein "root.gradle
" Muster für mein übergeordnetes Projekt - Die Datei build.gradle definiert normalerweise einige Projektspezifikationen und wird dann nurapply ${ROOT}
...Antworten:
Es ist nicht möglich, Methoden freizugeben, aber Sie können zusätzliche Eigenschaften freigeben, die einen Abschluss enthalten, der sich auf dasselbe beschränkt. Deklarieren Sie beispielsweise
ext.foo = { ... }
incommon-methods.gradle
, verwenden Sieapply from:
, um das Skript anzuwenden, und rufen Sie dann den Abschluss mit auffoo()
.quelle
File foo(String f)
wird werdenext.foo = { f -> ... }
, kann ich dann einfach so etwas machen wie :File f = foo(...)
?Aufbauend auf Peters Antwort exportiere ich meine Methoden folgendermaßen:
Inhalt von
helpers/common-methods.gradle
:Und so verwende ich diese Methoden in einem anderen Skript:
Hier erfahren Sie mehr über das Konvertieren von Methoden in Closures in Groovy.
quelle
ext
.Mit dem Kotlin dsl funktioniert es folgendermaßen:
build.gradle.kts :
external.gradle.kts :
quelle
Ein anderer Ansatz für Kotlin DSL könnte sein:
my-plugin.gradle.kts
settings.gradle.kts
quelle