Gradle-Projekte je nach Artefakten erstellt von Geschwister-Projekte
Habe ich das Gradle-setup mit vier Projekten, die ein Elternteil mit drei Kindern, wo ein Java-Servlet, JSON 'backend' ist gebaut in einen Krieg-Datei, und dann eine statische HTML5 'frontend' konsumieren diese in einer zip. Diese beiden "installiert" Ihre artifcats auf das lokale maven-repo.
Das Dritte Geschwister-Projekt 'Fusion' ist abhängig von diesen zwei Artefakte, zum Aufbau einer "merged" den Krieg, indem Sie einfach "zippen Sie zusammen".
Jedoch, einmal hatte ich das laufen als gedacht, ich hatte offensichtlich zu test der bootstrap-Szenario durch löschen der Artefakte aus dem lokalen repo.
Nun habe ich plötzlich ein "Artefakt 'no.company:frontend:1.0-SNAPSHOT@zip" nicht gefunden".
Ist es nicht möglich, angewiesen auf Artefakte, die produziert werden durch die aktuelle build?
Edit:
Basiert auf einer anderen Idee (und die Antwort von Peter entmutigend das Maven-Logik), diese version sieht vielversprechend aus, nicht durchqueren Maven (Hinweis: es funktioniert!):
//## From frontend's build.gradle:
task zipFrontend(dependsOn: 'buildFrontend', type: Zip) {
from ('dist/')
}
//## From backend's build.gradle:
apply plugin: 'war'
//## From merger's build.gradle:
task mergeFrontAndBack(dependsOn: [':backend:war',
':frontend:zipFrontend'], type: War) {
from zipTree(project(':frontend').tasks['zipFrontend'].archivePath)
from zipTree(project(':backend').tasks['war'].archivePath)
destinationDir(buildDir)
}
Edit 2:
Basiert auf Peter ' s Kommentar über das nicht erreichen in der Geschwister-Projekt Struktur und seine konkreten Vorschläge, hier ist das entstandene Werk (Hinweis: es funktioniert!):
//## From frontend's build.gradle:
task zipFrontend(dependsOn: 'buildFrontend', type: Zip) {
from ('dist/')
}
configurations { zip }
artifacts { zip zipFrontend }
//## From backend's build.gradle:
apply plugin: 'war'
configurations { jsonOnlyWar }
artifacts { jsonOnlyWar war }
//## From merger's build.gradle:
configurations { merge }
dependencies {
merge project(path: ':backend', configuration: 'jsonOnlyWar')
merge project(path: ':frontend', configuration: 'zip')
}
task mergeFrontAndBack(dependsOn: configurations.merge, type: War) {
from { configurations.merge.collect { zipTree(it) } }
destinationDir(buildDir)
}
Du musst angemeldet sein, um einen Kommentar abzugeben.
Dem lokalen Maven-repository (und Gradle ist
install
Aufgabe) sollten nur verwendet werden, wenn der Austausch von Artefakten mit Maven-builds. Es ist nicht gedacht für den Austausch von Artefakten zwischen den Projekten, die von einem Gradle build und die Installation in das lokale Maven-repository wird nicht automatisch geschehen.Stattdessen
merger
muss erklären Projekt Abhängigkeiten auf die anderen beiden Projekte. Zum Beispiel:Dies setzt Voraus, dass
frontend
undbackend
richtig erklären Ihre Artefakte. (Dies kann automatisch geschehen, zum Beispiel wenn diewar
plugin verwendet wird.)Finden Sie mehr dazu in der Gradle User Guide, insbesondere die multi-Projekt-builds Kapitel.
configurations { zip }; artifacts { zip taskThatProducesZip }
. Dann passen Sie die Projekt-Abhängigkeiten (z.B.dependencies { merge project(path: ":frontend", configuration: "zip") }
.Zip
Aufgabe, als sonst, Sie könnten am Ende mit einigen dupliziertWar
Verhalten (z.B. dupliziert Deskriptoren). Eine weitere Verbesserung ist zu machenmergeFrontAndBack
abhängenconfigurations.merge
, statt auf einzelne Aufgaben.Verwendung dieses post und Ideen von anderswo machte ich ein github-Projekt - https://github.com/istomisgood/WarNode