67

基本的に、git の現在のブランチから外部で定義されたモジュールのアーティファクト バージョンが必要であることを意味するワークフロー要件があります。

つまり、git の master ブランチにいる<version>master-...</version>場合は必要であり、bugfixX ブランチにいる場合は<version>bugfixX-....</version>、この pom.xml 用に生成されたアーティファクトが必要です。

https://github.com/koraktor/mavanagaiataが SHA-1 ハッシュをプロパティとして提供できることを以前に発見しました。ドキュメントから、ブランチも提供できるようです。プロパティを設定<version>${our.version}</version>して pomに入れるだけのプロセスです。もしこれが可能なら、私は pom.xml が動作するのを見たいと思っています (そしてそれに対して 500 ポイントの報奨金も与えられます)。

そうでない場合は、前処理または「git checkout」のいずれかを使用して、いくつかのフックで追加の魔法を実行していると思います(まだ試していませんが、動作するコードも素晴らしいでしょう)。

トップレベルの pom があり、これを実行して ".." にプロパティ ファイルを生成してから、私が求めているこの機能が必要なモジュールをビルドします。

これを解決する方法について何か提案はありますか?

4

7 に答える 7

51

実際、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-checkoutfile に入れます。フック ファイルを実行するには、実行可能である必要があることに注意してください ( chmod +x post-checkout)。

プラグインに関するいくつかの注意事項versions- かなり柔軟で、多くのオプションをサポートし、プロジェクトの構造に応じて役立つ可能性のある他の目標がほとんどありません (親 pom を使用するかどうか、子には独自のバージョンがあるか、親から派生しますか)など)。したがって、上記のフックは、versionsプラグインの他の目標を使用するか、追加のパラメーターを指定することにより、特定のケースをサポートするためにわずかに変更される場合があります。

長所:

  • 屈強
  • これを機能させるために pom.xml ファイル自体を変更する必要はありません
  • この「機能」は、フックを非アクティブ化する (削除するか、実行不可にする) ことで簡単にオフにすることができます。pom.xml に変更を加える必要はありません。

短所:

  • 他のユーザーにフックの使用を強制することはできません。レポがクローンされた後に手動でインストールする必要があります (または、Git ユーザーが .git ディレクトリ内のものに触れることを恐れている場合は、フックをインストールするスクリプトを提供できます)。

アップデート

以下は、バージョンをブランチ名に設定するだけでなく、古いバージョンのサフィックスも保持する、より複雑なバージョンのフックです。たとえば、古いバージョンが提供されている場合、ブランチmaster-1.0-SNAPSHOTに切り替えると、プロジェクトのバージョンが に変更されます。この bash スクリプトにはいくつかの問題があります (名前にダッシュ記号 ( ) を含まないブランチ名が必要で、ルート pom のバージョンのみが必要です) が、フックがどのように拡張されるかについての考えを与えるかもしれません: mvn とbash コマンドを使用すると、POM 内の非常に多くの情報を抽出して更新できます。feature1feature1-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'
于 2012-12-20T12:54:28.133 に答える
18

この質問を復活させて、最近別の解決策を投稿して申し訳ありませんが、Maven のバージョンを動的に変更し、いくつかの git 機能を使用することは実際に可能git describeです。

これを行うプロジェクトはjgitver-maven-plugin (免責事項; 私は作成者です)であり、git 情報から maven プロジェクト バージョンを取得するために jgitver を使用します。

ここに画像の説明を入力

Maven拡張機能として非常に使いやすい

...
  <build>
      <extensions>
          <extension>
              <groupId>fr.brouillard.oss</groupId>
              <artifactId>jgitver-maven-plugin</artifactId>
              <version>0.1.0</version>
          </extension>
      </extensions>
     ...
  </build>
...

拡張機能はプラグイン拡張機能としても使用でき、たとえば SNAPSHOTS を使用したくない場合などに、より多くの構成が可能になります。完全な使用シナリオの説明については、プロジェクトページを参照してください。

多かれ少なかれ同じことを行うgradle プラグインも利用可能です。


[編集 1] : Thorbjørn Ravn Andersen コメントへの回答

プラグインは、元の pom ファイルまたは build.gradle ファイルを変更しません。
Maven プラグインの場合、変更は maven オブジェクト モデルのメモリ内で行われ、temp ディレクトリの一時ファイルに書き込まれます。計算は、git メタデータ (タグ、コミットなど) のみに基づいています。
この非変更により、git 履歴を汚染することはありません。git commit に満足したら、タグを付けてgit tag -a x.y.z:mvn deployそれだけです。
プロジェクト ファイルのバージョンは役に立たなくなり、たとえば 0 に設定できます。

現在、IDEA-155733により、IntelliJ の最近の EAP バージョンのみが maven プラグインで動作します。Eclipse と Netbeans は問題ありません。


于 2016-06-24T07:41:14.507 に答える
4

アーティファクト ファイル名に git タグとバージョン情報を設定するだけで十分な場合は、maven-jgit-buildnumber-pluginを使用できます。

<build>
  <finalName>${artifactId}-${git.buildnumber}</finalName>
  <plugins>
    <plugin>
      <groupId>ru.concerteza.buildnumber</groupId>
      <artifactId>maven-jgit-buildnumber-plugin</artifactId>
      <version>1.2.7</version>
      <executions>
        <execution>
          <id>git-buildnumber</id>
          <goals>
            <goal>extract-buildnumber</goal>
          </goals>
          <phase>prepare-package</phase>
        </execution>
      </executions>
    </plugin>
    <!-- more plugins -->
  </plugins>
</build>
于 2014-08-22T16:51:04.220 に答える
2

gitのリビジョン番号を使用する機会を与えるbuildnumber-maven-pluginを確認しましたか?しかし、あなたは何か違うものが必要でした。さらに、私は次のようなことを提案します:

   1.0.0-SNAPSHOT 
   1.0.0-SNAPSHOT 

マスターにビーイング

ブランチでは、バージョンを次のように簡単に変更できます。

  1.0.0-BF-SNAPSHOT 
于 2012-11-27T15:02:13.353 に答える
2

このプラグインを試してみましたか?: https://github.com/ktoso/maven-git-commit-id-plugin . リポジトリの状態に関するすべての関連情報を含むプロパティ ファイルを生成するように構成できます。

  • ブランチ
  • 説明
  • commitId
  • buildUserName
  • buildUserEmail
  • ビルド時間
  • commitUserName
  • commitUserEmail
  • commitMessageShort
  • commitMessageFull
  • commitTime
于 2012-12-20T15:37:19.557 に答える