8

次のマルチプロジェクトの場合、バージョン管理とリリース管理のベスト プラクティスは何ですか?

プロジェクトの構造

  • グローバル親
    • 親プロジェクト (バージョン: 1.0-SNAPSHOT)
      • 子プロジェクト 1 (親と同じ)
      • 子プロジェクト 2 (親と同じ)
      • 子プロジェクト 3 (親と同じ)
      • 子プロジェクト 4 (親と同じ)
      • …</li>

プロジェクトのすべての部分が同じバージョンでなければならないため、親プロジェクトとすべての子プロジェクトのバージョンを 1 回だけ設定したいと考えています。

また、私が望むのは、continuum/maven を使用してプロジェクトをリリースすることです。

現在の「悪い」解決策:

通常、親 pom でバージョンを設定し、すべての子で「親からの最後のバージョン」と言うのが簡単な方法ですが、これは Maven <3.1 では機能しません (こちらを参照)[http://jira.codehaus.org/browse/ MNG-624] すべての子プロジェクトに親プロジェクトのバージョンを設定し、リリースごとにすべての子と親のバージョンを変更する必要があります。

例:

<groupId>com.test</groupId>
<artifactId>com.test.buildDefinition</artifactId>
<version>1.0-SNAPSHOT</version>

<parent>
    <groupId>com.test</groupId>
    <artifactId>com.test.buildDefinition</artifactId>
    <version>1.0-SNAPSHOT</version>
</parent>

<groupId>com.test</groupId>
<artifactId>com.test.project</artifactId>
<version>${parent.version}</version>

Continuum を使用して今すぐプロジェクトをリリースしたい場合は、次の順序でリリースします。

  1. 親プロジェクト
  2. 子プロジェクト 1
  3. 子プロジェクト 2
  4. …</li>

しかし、これは機能しません。親のバージョンを変更した後、子は親に SNAPSHOT バージョンを持たなくなり、連続体でマルチプロジェクトをリリースするより良い方法があるに違いないと思います。

4

3 に答える 3

2

タグに子モジュールを追加すると、<dependencyManagement/>その問題は発生しないと確信しています。

<groupId>com.test</groupId>
<artifactId>com.test.buildDefinition</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>pom</packaging>

<modules>
    <module>child1</module>
    <module>child2</module>
</modules>

<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>com.test</groupId>
            <artifactId>com.test.child1</artifactId>
            <version>${project.version}</version>
        </dependency>
        <dependency>
            <groupId>com.test</groupId>
            <artifactId>com.test.child2</artifactId>
            <version>${project.version}</version>
        </dependency>
    </dependencies>
</dependencyManagement>

子1

<parent>
    <groupId>com.test</groupId>
    <artifactId>com.test.buildDefinition</artifactId>
    <version>1.0-SNAPSHOT</version>
</parent>

<!-- groupId and version can be skipped since it will be inherited from parent -->
<artifactId>com.test.child1</artifactId>

Child2 (Child1 に依存)

<parent>
    <groupId>com.test</groupId>
    <artifactId>com.test.buildDefinition</artifactId>
    <version>1.0-SNAPSHOT</version>
</parent>

<!-- groupId and version can be skipped since it will be inherited from parent -->
<artifactId>com.test.child2</artifactId>

<dependencies>
    <dependency>
        <groupId>com.test</groupId>
        <artifactId>com.test.child1</artifactId>
    </dependency>
</dependencies>

dependencyManagement を使用する場合、モジュール間の依存関係は、親の pom で定義されているため、バージョンを定義する必要はありません。

このアプローチでマルチモジュール プロジェクトをリリースする際に問題が発生したことはありません。

編集

明確にするために:dependencyManagement親子間の継承とは何の関係もありません。子モジュール間の依存関係のバージョンに関する問題を解決します。そして、それはリリース中に機能します。

于 2012-08-20T14:04:06.093 に答える
1

同時に同一のバージョン管理されたモジュールに対して、単一のバージョン管理階層の下にマルチモジュール構造を作成する必要があります。Continuum を使用すると、モジュールごとに単一のジョブまたは複数のジョブとしてそれらをグループに追加できます。いずれの方法でも、リリース メカニズムが親からトリガーされ、バージョンが自動的に解決されます。

<version>${parent.version}</version>ちなみに、親から継承されるため、同一の groupIdをドロップできます。

グローバルな親が個別にリリースされている場合は、同じマルチモジュール構造の一部にするのではなく、個別のモジュールに分割する必要があります。このレイアウトのサンプル プロジェクトは、https ://github.com/brettporter/centrepoint にあります。

于 2012-08-21T03:43:01.043 に答える
0

すべてのバージョン番号の同期を維持したい場合は、MavenリリースプラグインのautoVersionSubmodulesフラグを利用できます。この値をtrueに設定すると、最上位のプロジェクトレベルでリリースを実行し、すべてのサブモジュールを親と同じバージョンでリリースすることができます。

これは、実行時のコマンドラインmvn -DautoVersionSubmodules release:prepareまたはPOMファイルで次のように指定できます。

<plugin>
  <artifactId>maven-release-plugin</artifactId>        
  <version>2.3.2</version>
  <configuration>
    <autoVersionSubmodules>true</autoVersionSubmodules>
  </configuration>
</plugin>

Continuumを使用したことはありませんが、Mavenリリースプラグインを内部で使用していると思いますか?一部のグーグルは、これが機能する可能性があることを示唆しています(Continuumインターフェイスがこのシナリオを処理する方法に関する多くの「あると便利な」バグに基づいています)。

于 2012-08-20T14:55:19.353 に答える