web-dev-qa-db-ja.com

ソースコードまたはバイナリに依存するには?

BがAに依存する異なるチームによって開発された2つの社内プロジェクトAとBがあります。両方のプロジェクトのソースコードはgitに格納されているため、プロジェクトAをサブモジュールとしてプロジェクトBに含め、ビルドシステムを構成しました両方を正しい順序で構築します。別の解決策は、ArtifactoryやNexusなどのバイナリリポジトリマネージャーを介してAを使用することです。

ソースコードに依存するか、バイナリアーティファクトに依存するかの長所と短所について疑問に思います。どちらが優れているのですか?これまでのところ、次のような要素を考え出すことができましたが、他の意見を聞くのはとても楽しみです。

ソースコードに応じてより良いです

  • バイナリレポジトリマネージャーがない場合
  • 別のプロジェクトのプレリリースバージョンに依存する必要がある場合
  • 別のプロジェクトにパッチを適用する必要がある場合
  • iDEで依存関係のソースコードを参照する方が簡単だから

バイナリに依存する方が良い

  • ビルド時間を最小限にする
  • 別のプロジェクトのビルド環境をセットアップする手間を避けるため
9
mkalkov

ソースの依存関係よりも常にバイナリの依存関係をお勧めします。ソースコードとしてリストしたプロのほとんどは、バイナリの依存関係にも簡単に組み込むことができます。

まず、一部のローカルサーバーにNexusリポジトリを設定するのはとても簡単です。バイナリレポを使用する利点は、セットアップの労力/コストをはるかに上回ります。これは私の答えの残りの部分のほとんど前提条件です:)

プレリリースバージョンの場合、プロジェクトは-SNAPSHOTバージョンをアーティファクトにデプロイする必要があります。次のように、バージョン間に明確な違いがある場合があります。

  • projectA-3.2.0-SNAPSHOT:活発な開発、いつでも変更される可能性があります
  • projectA-3.2.0-RC1:リリース候補
  • projectA-3.2.0:プロダクションリリース

これらのバージョンはすべて、アーティファクトに一緒に保存できます。プロジェクトは、コンパイル対象を正確に把握しています。

パッチの場合、gitがあなたの友達です。レポをフォークして、projectA-3.2.1-FOR_PROJ_Bなどのパッチバージョン番号を入力します。 .1がパッチリリースと記述子を示していることに注目してください。これにより、プロジェクトがこれらの変更を後でマスターに戻すのも簡単になります。

ソースコードの場合、ビルドツールを構成して「ソースjar」を生成し、バイナリjarと共にアーティファクトリーにデプロイできます。ほとんどのIDEはソースjar名を検索し、ソースを自動的にダウンロードできます。

ソースコードに近づかないもう1つの大きな理由は、プロジェクトAのビルドシステム、ツールチェーン、およびコンパイル時の依存関係に縛られていることです。プロジェクトBでビルドエラーが発生した場合は、まずプロジェクトAまたはプロジェクトBが原因でエラーが発生しました。プロジェクトAの場合は、そのプロジェクトの人を追跡してビルドを修正する必要があります。これにより、ビルドサイクルに多くのオーバーヘッドが追加されます。

5
metacubed

バイナリ依存関係に行くでしょう。私を支持するあなたの考慮事項のほとんどは批評家なしです:

  • バイナリリポジトリマネージャがない場合は問題ありませんが、それを確立するのはそれほど難しいことではないと思います。最も基本的なレベルでは、使用するバージョンを決定する担当者だけが書き込むことができる共有フォルダー。

  • 別のプロジェクトのプレリリースバージョンに依存する必要がある場合:metacubedですでにカバーされています。ソースコードまたはバイナリの依存関係のいずれかを使用している場合は、プレリリース版であっても、安定したバージョンを使用する必要があります。もちろん、プレリリースを対象に開発する場合は、バグの解決のために、更新されたバージョンに切り替える必要がある場合がほとんどです。

  • 別のプロジェクトにパッチを適用する必要がある場合:チームが同じ家の別のチームから作成されたプロジェクトにパッチを適用するということですか?最も賢明な戦略は、他のチームにプロジェクトで抱えている問題を伝えることです。

  • iDEで依存関係のソースコードを参照する方が簡単だからです。依存関係の内部の仕組みを覗き見する必要はありません。

    • プロジェクトAの文書化が不十分
    • コーダーはプロジェクトAの「文書化されていない機能」の使用を終了しますが、更新時に事前の警告なしに消えることがあります。
1
SJuan76