実際、Maven はそれ自身のプロジェクトのバージョンを、他の目的で 1 回の実行で変更することはできません。その上、私の知る限り、Maven は<version>
タグ内の任意のプロパティをサポートしていません。したがって、POM のバージョンを変更するゴールを実行するには、別の実行が必要です。それを行うことができるさまざまなプラグインがあります-この場合、プラグインのversions:set
ゴールを使用できます-http://mojo.codehaus.org/versions-maven-plugin/set-mojo.htmlversions
したがって、たとえば次のように実行できます。
mvn versions:set -DgenerateBackupPoms=false -DnewVersion=$branch-SNAPSHOT
$branch
変数には現在の Git ブランチ名を含める必要があります。次のように、で抽出できますgit rev-parse
。
branch=$(git rev-parse --abbrev-ref HEAD)
それでも、何らかの方法でそれを実行する必要があります。手動で行うこともできますが、面倒です。したがって、私の推測では、Git 側からこれにアプローチすることが実際に最も堅牢なソリューションになると思います。つまり、Git フックです。これは、ジョブを実行する完全な Gitpost-checkout
フックです (個々のファイルのみではなく、ブランチがチェックアウトされた場合にのみフックを実行するようにフィルタリングを行った上記と同じコード):
#!/bin/bash
echo 'Will change the version in pom.xml files...'
# check if the checkout was to checkout a branch
if [ $3 != '1' ]
then echo 'git checkout did not checkout a branch - quitting';exit
fi
# get current branch name
branch=$(git rev-parse --abbrev-ref HEAD)
version=$branch-SNAPSHOT
# run maven versions plugin to set new version
mvn versions:set -DgenerateBackupPoms=false -DnewVersion=$version
echo 'Changed version in pom.xml files to $version'
この内容をファイルPROJECTDIR\.git\hooks\post-checkout
file に入れます。フック ファイルを実行するには、実行可能である必要があることに注意してください ( chmod +x post-checkout
)。
プラグインに関するいくつかの注意事項versions
- かなり柔軟で、多くのオプションをサポートし、プロジェクトの構造に応じて役立つ可能性のある他の目標がほとんどありません (親 pom を使用するかどうか、子には独自のバージョンがあるか、親から派生しますか)など)。したがって、上記のフックは、versions
プラグインの他の目標を使用するか、追加のパラメーターを指定することにより、特定のケースをサポートするためにわずかに変更される場合があります。
長所:
- 屈強
- これを機能させるために pom.xml ファイル自体を変更する必要はありません
- この「機能」は、フックを非アクティブ化する (削除するか、実行不可にする) ことで簡単にオフにすることができます。pom.xml に変更を加える必要はありません。
短所:
- 他のユーザーにフックの使用を強制することはできません。レポがクローンされた後に手動でインストールする必要があります (または、Git ユーザーが .git ディレクトリ内のものに触れることを恐れている場合は、フックをインストールするスクリプトを提供できます)。
アップデート
以下は、バージョンをブランチ名に設定するだけでなく、古いバージョンのサフィックスも保持する、より複雑なバージョンのフックです。たとえば、古いバージョンが提供されている場合、ブランチmaster-1.0-SNAPSHOT
に切り替えると、プロジェクトのバージョンが に変更されます。この bash スクリプトにはいくつかの問題があります (名前にダッシュ記号 ( ) を含まないブランチ名が必要で、ルート pom のバージョンのみが必要です) が、フックがどのように拡張されるかについての考えを与えるかもしれません: mvn とbash コマンドを使用すると、POM 内の非常に多くの情報を抽出して更新できます。feature1
feature1-1.0-SNAPSHOT
-
#!/bin/bash
echo 'Will change the version in pom.xml files...'
# check if the checkout was to checkout a branch
if [ $3 != '1' ]
then echo 'git checkout did not checkout a branch - quitting';exit
fi
# get current branch name
branch=$(git rev-parse --abbrev-ref HEAD)
# get current version of the top level pom
current_version=$(mvn help:evaluate -Dexpression=project.version | grep -v '\[.*')
# extract version suffix
suffix=$(echo $current_version | cut -d \- -f 2)
# build new version
version=$branch-$suffix
# run maven versions plugin to set new version
mvn versions:set -DgenerateBackupPoms=false -DnewVersion=$version
echo 'Changed version in pom.xml files to $version'