スケーラブルなソリューションは、ソリューション ディレクトリでsvn-externalを実行して、インポートしたプロジェクトが他のプロジェクトと並行して表示されるようにすることです。その理由を以下に示します。
「インポートされた」プロジェクトに別のサブディレクトリを使用すること、たとえばexternals
svn-external を使用することは、プロジェクト間の重要な依存関係が発生するまでは良い考えのようです。たとえば、プロジェクト A がプロジェクト B のプロジェクトに依存し、プロジェクト B がプロジェクト C に依存しているとします。その後、プロジェクト A のソリューション S がある場合、次のディレクトリ構造になります。
# BAD SOLUTION #
S
+---S.sln
+---A
| \---A.csproj
\---externals
+---B <--- A's dependency
| \---B.csproj
\---externals
\---C <--- B's dependency
\---C.csproj
この手法を使用すると、ツリー内に 1 つのプロジェクトの複数のコピーが作成されることさえあります。これは明らかにあなたが望むものではありません。
さらに、プロジェクトがNuGetの依存関係を使用している場合、それらは通常packages
最上位のディレクトリに読み込まれます。これは、サブディレクトリ内のプロジェクトの NuGet 参照externals
が壊れることを意味します。
また、SVN に加えてGitを使用する場合、変更を追跡するための推奨される方法は、プロジェクトごとに個別の Git リポジトリを用意し、その中git submodule
のプロジェクトを使用するソリューション用に個別の Git リポジトリを用意することです。Git サブモジュールが親モジュールの直下のサブディレクトリでない場合、Git submodule コマンドは直下のサブディレクトリであるクローンを作成します。
すべてのプロジェクトを同じレイヤーに置くことのもう 1 つの利点は、すべてのソリューション (Git または svn-external 経由で追跡) からのプロジェクトを含む「スーパー ソリューション」を作成できることです。単一のソリューション - 単一のプロジェクトに加えた変更が他のすべてのプロジェクトと一致するように再構築します。
# GOOD SOLUTION #
S
+---S.sln
+---A
| \---A.csproj
+---B <--- A's dependency
| \---B.csproj
\---C <--- B's dependency
\---C.csproj