Javaを使用して高度にコンポーネント化された開発を実践しており、トランクには独立したライフサイクルを持つ約250のモジュールがあります。依存関係はMavenを介して管理され(これがベストプラクティスです)、すべてのイテレーション(隔週)でアクティブに開発されたモジュールに新しいバージョンのタグが付けられます。厳密なセマンティクスを持つ3桁のバージョン番号(major.minor.build-メジャー変更は下位互換性がないことを意味し、マイナー変更は下位互換性を意味し、ビルド番号の変更は下位互換性と上位互換性を意味します)。私たちの究極のソフトウェア製品は、Mavenの依存関係として、数十の個別のモジュールを取り込むアセンブリです。
リリースされたバージョンのバグ修正または拡張を行う必要があり、HEADバージョンを提供できない場合は、モジュール/アセンブリを分岐します。すべてのバージョンにタグを付けるとこれが簡単になりますが、ブランチには、ツールによって部分的に引き起こされる大きな管理オーバーヘッド(特に、ブランチを特定のHEADチェンジセットと同期させる)が発生します。Subversionはブランチの管理に最適ではありません。
リポジトリ内のかなりフラットで、とりわけ予測可能なツリー構造が重要であることがわかりました。これにより、手動リリースプロセスから多くの苦痛と危険を取り除くリリースツールを構築することができました(リリースノートの更新、プロジェクトのコンパイル、単体テストの実行、タグの作成、SNAPSHOTの依存関係なしなど)。ツリー構造に分類やその他のロジックを入れすぎないようにしてください。
大まかに次のようなことをします。
svnrepo/
trunk/
modules/
m1/ --> will result in jar file
m2/
...
assemblies/
a1/
...
tags/
modules/
m1/
1.0.0/
1.0.1/
1.1.0/
m2/
...
assemblies/
a1/
iteration-55/
...
branches/
m1/
1.0/
...
外部の依存関係については、Mavenのようなものを強調しすぎることはできません。リポジトリ内のバージョン管理された一意に識別されたバイナリアーティファクトへの参照として依存関係を管理します。
内部モジュール/プロジェクト構造の場合:標準に固執します。均一性が鍵となります。繰り返しになりますが、Mavenは構造を指示するため、ここで役立ちます。あなたがそれらに固執する限り、多くの構造は素晴らしいです。