C# で .NET エンタープライズ ソフトウェアを開発します。バージョン管理システムの改善を検討しています。私は以前にマーキュリアルを使用したことがあり、当社でそれを使用して実験してきました。ただし、エンタープライズ製品を開発しているため、再利用可能なコンポーネントまたはモジュールに重点を置いています。コンポーネントと依存関係を管理するために Mercurial のサブリポジトリを使用しようとしていますが、いくつかの問題があります。ソース管理/依存関係管理の基本的な要件は次のとおりです。
- 再利用可能なコンポーネント
- ソースごとに共有 (デバッグ用)
- サードパーティのバイナリやその他の再利用可能なコンポーネントに依存している
- 消費する製品のコンテキストで開発し、ソース管理にコミットすることができます
- 依存関係
- 製品は、サードパーティのバイナリやその他の再利用可能なコンポーネントに依存しています
- 依存関係には独自の依存関係があります
- 開発者は、依存関係でのバージョンの競合を通知する必要があります
これが私が使用しているmercurialの構造です:
再利用可能なコンポーネント:
SHARED1_SLN-+-docs
|
+-libs----NLOG
|
+-misc----KEY
|
+-src-----SHARED1-+-proj1
| +-proj2
|
+-tools---NANT
最初のものを消費する 2 番目の再利用可能なコンポーネント:
SHARED2_SLN-+-docs
|
+-libs--+-SHARED1-+-proj1
| | +-proj2
| |
| +-NLOG
|
+-misc----KEY
|
+-src-----SHARED2-+-proj3
| +-proj4
|
+-tools---NANT
両方のコンポーネントを消費する製品:
PROD_SLN----+-docs
|
+-libs--+-SHARED1-+-proj1
| | +-proj2
| |
| +-SHARED2-+-proj3
| | +-proj4
| |
| +-NLOG
|
+-misc----KEY
|
+-src-----prod----+-proj5
| +-proj6
|
+-tools---NANT
ノート
- レポはCAPSです
- すべての子リポジトリはサブリポジトリと見なされます
- サードパーティ (バイナリ) ライブラリと内部 (ソース) コンポーネントはすべて、libs フォルダーにあるサブリポジトリです。
- サードパーティのライブラリは個々の mercurial リポジトリに保持されるため、使用するプロジェクトはライブラリの特定のバージョンを参照できます (つまり、古いプロジェクトは NLog v1.0 を参照し、新しいプロジェクトは NLog v2.0 を参照する場合があります)。
- すべての Visual Studio .csproj ファイルは第 4 レベル (proj* フォルダー) にあり、依存関係への相対参照が可能です (つまり、NLog を参照するすべての Visual Studio プロジェクトの ../../../libs/NLog/NLog.dll)。
- すべての Visual Studio .sln ファイルは第 2 レベル (src フォルダー) にあるため、コンポーネントを消費コンポーネントまたは製品に「共有」するときに含まれません。
- 開発者は、ソースが使用する Visual Studio プロジェクトの proj* フォルダーの子である限り (つまり、さまざまなソース/リソースを含む proj* フォルダーに n 個の子を含めることができます)、適切と思われるソース ファイルを自由に編成できます。
- Bob が SHARED2 コンポーネントと PROD1 製品を開発している場合、PROD1_SLN リポジトリ内で SHARED2 ソース (proj3 に属するソースなど) を変更し、それらの変更をコミットすることは完全に合法です。消費プロジェクトのコンテキストで誰かがライブラリを開発しても、私たちは気にしません。
- 社内で開発されたコンポーネント (SHARED1 および SHARED2) は、通常、プロジェクトを使用するソースによって含まれます (Visual Studio では、dll 参照を参照するのではなく、プロジェクトへの参照を追加します)。これにより、強化されたデバッグ (ライブラリ コードへのステップ イン) が可能になり、Visual Studio がプロジェクトを再構築する必要があるとき (依存関係が変更されたとき) を管理できるようになり、必要に応じてライブラリを変更できるようになります (上記のメモで説明されているように)。
質問
Bob が PROD1 で作業しており、Alice が SHARED1 で作業している場合、Alice が SHARED1 に変更をコミットしたとき、Bob はどのようにして知ることができますか。現在 Mercurial を使用しているため、Bob は各サブレポ内で手動でプルして更新する必要があります。彼が PROD_SLN リポジトリからサーバーにプッシュ/プルする場合、サブリポジトリの更新についてはまったく知りません。これはMercurial wikiで説明されています。ボブがサーバーから最新の PROD_SLN をプルしたときに、サブリポジトリの更新をボブに通知するにはどうすればよいですか? 理想的には、通知を受け取り (できればプル中に)、更新するサブリポジトリを手動で決定する必要があります。
SHARED1 は NLog v1.0 (mercurial の commit/rev abc) を参照し、SHARED2 は Nlog v2.0 (mercurial の commit/rev xyz) を参照するとします。ボブが PROD1 でこれら 2 つのコンポーネントを吸収している場合、ボブはこの不一致に注意する必要があります。技術的には、Visual Studio/.NET では 2 つのアセンブリが異なるバージョンの依存関係を参照できますが、NLog に依存するすべての .NET プロジェクトで NLog へのパスが固定されているため、私の構造ではこれが許可されません。ボブは、2 つの依存関係にバージョンの競合があることをどのように知ることができますか?
ボブが PROD1 のリポジトリ構造を設定していて、SHARED2 を含めたい場合、SHARED2 に必要な依存関係をどのように知ることができますか? 私の構造では、彼は SHARED2_SLN リポジトリを手動で複製 (またはサーバー上で参照) し、libs フォルダーを調べるか、.hgsub ファイルをピークして、含める必要がある依存関係を判断する必要があります。理想的には、これは自動化されます。製品に SHARED2 を含めると、SHARED1 と NLog も自動的に組み込まれ、他の依存関係とのバージョンの競合があるかどうかが通知されます (上記の質問 2 を参照)。
より大きな質問
水銀は正しい解決策ですか?
より良い水銀構造はありますか?
これはサブリポジトリの有効な使用法ですか (つまり、Mercurial 開発者はサブリポジトリを最後の手段としてマークしました)?
依存関係の管理に Mercurial を使用することは理にかなっていますか? 依存関係を管理するためのさらに別のツールを使用することもできます (おそらく、内部の NuGet フィードでしょうか?)。これはサードパーティの依存関係にはうまく機能しますが、内部で開発されたコンポーネントには本当に面倒です (つまり、それらが積極的に開発されている場合、開発者は常にフィードを更新する必要があり、内部でそれらを提供する必要があり、許可されません)。消費するプロジェクトによって変更されるコンポーネント (注 8 および質問 2)。
エンタープライズ .NET ソフトウェア プロジェクト向けのより良いソリューションはありますか?
参考文献
私はいくつかのSOの質問を読み、これが役立つことがわかりましたが、受け入れられた回答は、依存関係に専用のツールを使用することを提案しています. このようなツールの機能は気に入っていますが、使用中のプロジェクトから依存関係を変更してコミットすることはできません (より大きな質問 4 を参照)。