Aktualisierung 2022: Seit der Abfassung dieser Antwort im Jahr 2012 wurden alternative Lösungen geschaffen. Während die hier vorgestellte Git-Hook-Lösung noch gültig ist (mit ihren Vor- und Nachteilen), werden hier gute Antworten vorgestellt, die pluginbasierte oder sogar reine Maven-Lösungen präsentieren, die ich empfehlen würde zu berücksichtigen.
Tatsächlich kann Maven [Hinweis 2022: es sei denn, es werden dem Projekt einige Plugins hinzugefügt] die Version seines eigenen Projekts nicht in einem Durchlauf mit anderen Zielen ändern. Zusätzlich unterstützt reines Maven keine beliebigen Eigenschaften im -Tag. Daher ist eine separate Ausführung erforderlich, um ein Ziel auszuführen, das die Version des POMs ändert. Es gibt verschiedene Plugins, die dies tun können. Zum Beispiel: das Ziel versions:set
vom Plugin versions
- http://mojo.codehaus.org/versions-maven-plugin/set-mojo.html
Also könnten Sie es folgendermaßen ausführen:
mvn versions:set -DgenerateBackupPoms=false -DnewVersion=$branch-SNAPSHOT
wobei die Variable $branch
den Namen des aktuellen Git-Branches enthalten muss; er kann mit git rev-parse
extrahiert werden, wie folgt:
branch=$(git rev-parse --abbrev-ref HEAD)
Dennoch muss es irgendwie ausgeführt werden. Sie können es manuell tun, aber das ist umständlich. Daher ist meine Vermutung, dass die robusteste Lösung tatsächlich sein würde, dies von der Git-Seite aus anzugehen. Das heißt - ein Git-Hook. Hier ist der vollständige Git-post-checkout
-Hook, der die Arbeit erledigen wird (der gleiche Code wie oben mit einigen Filtern, um den Hook nur auszuführen, wenn der Branch ausgecheckt wird, nicht nur die einzelnen Dateien):
#!/bin/bash
echo 'Ändere die Version in pom.xml-Dateien...'
# Überprüfen, ob der Checkout zum Auschecken eines Branchs war
if [ $3 != '1' ]
then echo 'git checkout hat keinen Branch ausgecheckt - beende';exit
fi
# aktuellen Branchnamen abrufen
branch=$(git rev-parse --abbrev-ref HEAD)
version=$branch-SNAPSHOT
# führe das Maven-Versionen-Plugin aus, um die neue Version zu setzen
mvn versions:set -DgenerateBackupPoms=false -DnewVersion=$version
echo 'Version in pom.xml-Dateien zu $version geändert'
Fügen Sie diesen Inhalt in die Datei PROJECTDIR\.git\hooks\post-checkout
ein. Beachten Sie, dass die Hook-Datei ausführbar sein sollte, um sie auszuführen (chmod +x post-checkout
).
Ein paar Anmerkungen zum versions
-Plugin - es ist ziemlich flexibel und unterstützt viele Optionen und hat einige andere Ziele, die je nach Projektstruktur hilfreich sein könnten (verwenden Sie Eltern-POMs oder nicht, haben Kinder ihre eigenen Versionen oder leiten sie von Eltern ab, usw.). Daher könnte der obige Hook leicht modifiziert werden, um Ihren spezifischen Fall zu unterstützen, indem andere Ziele des versions
-Plugins verwendet oder zusätzliche Parameter angegeben werden.
Vorteile:
- Robust
- Es ist nicht erforderlich, etwas in den pom.xml-Dateien selbst zu ändern, damit dies funktioniert
- Diese "Funktionalität" kann einfach durch Deaktivierung des Hooks deaktiviert werden (entfernen oder nicht ausführbar machen) - auch hier sind keine Änderungen in der pom.xml erforderlich
Nachteile:
- Man kann andere nicht dazu zwingen, einen Hook zu verwenden - er sollte manuell installiert werden, nachdem das Repo geklont wurde (oder Sie können ein Skript bereitstellen, um den Hook zu installieren, wenn angenommene Git-Benutzer Angst haben, Dinge im .git-Verzeichnis zu berühren).
Eine ausführlichere Version des Bash-Skripts für den Git-Hook:
Hier ist die kompliziertere Version des Hooks, die nicht nur die Version auf den Branch-Namen setzt, sondern auch das Suffix der alten Version beibehält. Beispielsweise wird bei einer bereitgestellten alten Version master-1.0-SNAPSHOT
das Wechseln zum Branch feature1
die Version des Projekts auf feature1-1.0-SNAPSHOT
ändern. Dieses Bash-Skript leidet unter einigen Problemen (erfordert Branch-Namen ohne Bindestrichsymbol (-
) im Namen und nimmt nur die Version des Wurzelpoms), kann jedoch eine Vorstellung davon vermitteln, wie der Hook erweitert werden kann: Mit einer Mischung aus mvn- und Bash-Befehlen können Sie viele Informationen im POM extrahieren und aktualisieren.
#!/bin/bash
echo 'Ändere die Version in pom.xml-Dateien...'
# Überprüfen, ob der Checkout zum Auschecken eines Branchs war
if [ $3 != '1' ]
then echo 'git checkout hat keinen Branch ausgecheckt - beende';exit
fi
# aktuellen Branchnamen abrufen
branch=$(git rev-parse --abbrev-ref HEAD)
# aktuelle Version des obersten POM abrufen
current_version=$(mvn help:evaluate -Dexpression=project.version | grep -v '\[.*')
# Suffix der Version extrahieren
suffix=$(echo $current_version | cut -d \- -f 2)
# neue Version erstellen
version=$branch-$suffix
# führe das Maven-Versionen-Plugin aus, um die neue Version zu setzen
mvn versions:set -DgenerateBackupPoms=false -DnewVersion=$version
echo 'Version in pom.xml-Dateien zu $version geändert'