2012-10-19 10 views
9

私は、プロジェクトのSNAPSHOT依存性に依存して密閉型ビルドを実現する方法を作成しようとしています。例の目的のために密閉型Mavenビルドの作成

、私はこのような依存構造を持つプロジェクトを持っていると言う:

   ┌ other-1.2-SNAPSHOT 
mine-1.2.3 ──┤ 
      └ thing-3.1-SNAPSHOT ── gizmo-6.1.3-SNAPSHOT 

私がやりたい何かが私に関連している何かにローカルですべてのスナップショットの依存関係を解決しています私のNexusのリリースリポジトリにリリースとしてそれらを展開してください。これらの依存関係のすべてが内部的なものではないので、単にそれぞれのリリースを行うことはできません。

この例では、other-1.2-SNAPSHOTother-1.2-mine-1.2.3となり、thing-3.1-SNAPSHOTthing-3.1-mine-1.2.3になります。これは、Pythonの約60行で比較的簡単です。

しかし、問題は、推移的なスナップショットを具体的なバージョンに解決することです。ですからgizmo-6.1.3-SNAPSHOTgizmo-6.1.3-mine.1.2.3に変換し、thing-3.1-mine-1.2.3をそれに依存させる必要があります。

これは、私が欲しいものを達成するための1つの方法のほんの一例です。目標は1年か2年で、バージョン1.2.3のリリースブランチをチェックアウトして、mvn clean packageなどを実行することができます。これは、長年にわたってSNAPSHOTの依存関係を解決することを心配する必要はありません。

このブランチはコンパイル可能であり、アセンブリプラグインのjar-and-dependencies機能を使用してすべての依存関係を保持するだけではありません。私は潜在的にソースファイルを変更して、別のリリースビルド(例えば、修正プログラムの適用)を行うことができるようにしたいと思います。

ので、

  • は、具体的には、再帰的な方法でSNAPSHOT依存性を変換することができるようになります。この利用できるようなものはありますか?
  • この種のものを管理するプラグインはありますか?リリースプラグインは、branchゴールでいくつかの設定オプションを約束していましたが、私が望む程度に外部デップを解決しません。
  • 気密Mavenビルドを作成するための他のテクニックはありますか?
+3

私には反Mavenのハックのような音。 Mavenでは基本的な基本ルールの1つが** Convention Over Configuration **です。依存関係が自分で作成されている場合は、SNAPSHOT/RELEASEバージョンを適切に管理/使用する必要があります。彼らが別の場所にいる場合は、常に最新のリリース版(SNAPSHOT版ではない)を使用する必要があります。 [Maven The Complete Reference - セクション3.3.1](http://www.sonatype.com/books/mvnref-book/reference/pom-relationships-sect-pom-syntax.html#pom-reationships)をもう一度見てください。 -sect-versions)、MavenでなぜSNAPSHOTが使われているのかを見てください。 – yorkw

+0

私はMavenの基本を非常によく理解しています。しかし、私は現実の世界に住んでいます。デッドラインやサードパーティーの図書館は信じられないほど役に立つものですが、SNAPSHOTのバージョンに長時間座っています。あなたが知っているかもしれないJason Van Zylは、リリースの周りにプロセス重いシステムを持っているという概念が大きな間違いであったことを認めています(そして、テスラで変わっています)。私たちが消費しているすべてのプロジェクトの内部フォークを維持するのには足りず、私がやっていることは、ほとんどの場合よりも飛躍的に優れています。 –

+1

現実世界でさえ、何らかの理由が考慮されるべきです。あなたはここでシステムと戦っています。スナップショットは、タイムスタンプ付きのスナップショットを使用してアーティファクト解決に頼っている場合でも、十分に長く存続しません。私のアプローチは、依存関係と展開プラグインを使用してすべての成果物を取得し、スクリプトまたはいくつかの自己作成型プラグインを使用して、既知のスナップショット依存性を独自のmavenリポジトリに展開することです。たぶん、他のギズモと話すことも役立ちます:彼らが人工物のベータ版をリリースすることができれば、そんなに混乱しない人に頼ることができます。 – wemu

答えて

2

これは、広く使われている技術ではないが、このブログの記事で説明したように、あなたはいつも、「プロジェクト」リポジトリとしてプロジェクトにあなたの特定のスナップショットの依存関係を確認することができます。要するにMaven is to Ant as a Nail Gun is to a Hammer

依存関係のプラグインを使用して、プロジェクトディレクトリにあるリポジトリを作成します。以下の(あなたが読んでください)リンクのブログ記事からコピーされます。

1)を実行して、mvn -Dmdep.useRepositoryLayout=true -Dmdep.copyPom=true dependency:copy-dependencies

「すべてのプロジェクトの依存関係のレポのようなレイアウトでこの作成/ターゲット/依存関係」

<repositories> 
    <repository> 
    <releases /> 
    <id>snapshots-I-need-forever</id> 
    <name>snapshots-I-need-forever</name> 
    <url>file:///${basedir}/libs</url> 
    </repository> 
</repositories> 
012:

2)あなたのPOMに次のようなリポジトリの宣言を追加しますlibs/

3)のようなものにtarget/dependencies/をコピーします..適切な場所にダウンロードした依存関係を移動するAntRunプラグインを使用して

希望これをライフサイクルphasephaseに依存プラグインを設定することにより、ステップ1、ステップ2:

あなたはこのビルド/リリースプロセスの自動化された一部作りますあなたのために働く。私は今シャワーを取らなければならない...

+0

私はこれを正確にはしませんでしたが、将来の旅行者はおそらくこの解決策を望んでいます。特別なネクサスリポジトリを作成し、それにカスタムバージョンをデプロイして、元のポストで説明したのと同じように、スクリプトを使ってpomを更新します。私は最後の仕事でこのテクニックを使っていましたが、同様のユースケースではうまくいきました。 –

2

mavenバージョンのプラグインは、あなたが望むもののほとんどを行います。あなたは、ほとんどcertianlyあなたはすべての依存関係を解決し、それに応じてポンポンファイルを更新するビルド前の段階でそれを実行する必要がありますしかし

http://mojo.codehaus.org/versions-maven-plugin/

。次に、実際のビルドを実行するためにmaven(pomを再読み込み)を再実行します。個別の目標を使用して起動されたpom内のすべてを構成できるため、別個のスクリプトを避けることができます。

これは、SNAPSHOT依存関係の代わりに特定のバージョンを使用し、必要に応じてプリビルド手順をアップグレードするようにすると効果的です。依存関係解決の唯一の違いは、mavenは常に-SNAPSHOT依存関係を再ダウンロードするのに対し、新しいバージョンがあれば通常の依存関係をダウンロードすることです。しかし、多くのプラグイン(バージョンプラグインを含む)は、-SNAPSHOT依存関係を別々に扱い、問題を引き起こします。すべてのCIビルドに新しいバージョン番号が付いているので、私は決して-SNAPSHOTを使用しません。開発者のローカルビルドなどのために、より予測可能な動作を持つ-DEVのような別のタグを優先します。このようなこと。私が知っているほとんどのプロジェクトは、バージョン番号を設定したり、このような他の制限を回避するために、何らかの事前ビルドステップを持っています。 mavenはpomを一度しか読み込みませんし、文字列の置換はいくつかの場所では機能せず、展開/インストールされたpomは一般に文字列の置換や変更の結果を含んでいないので、ビルド中に。

関連する問題