アセンブリ参照の複雑なセットを持つ Visual Studio ソリューション ( TFS Aggregator ) があり、NuGet を使用して解決しようとしています。リファレンスは、.Net プラットフォームではなく、ターゲットの構成に依存します。
問題定義
ソリューションには多数のプロジェクトがあり、そのほとんどが共通のアセンブリ セットを参照しています。API の変更を公開するさまざまなアセンブリのバージョンがあります。ソース コードには、バージョンの違いを管理するための条件付きコンパイル #ifが散在しています。したがって、プロジェクトとソリューションにはいくつかの構成があります。プロジェクト参照は、構成によって異なります。
現在の状態
ソースでわかるように、すべてのプロジェクトは、 Chooseを使用していくつかの魔法を実行する共通の MSBuild ファイルをインポートし ます。参照アセンブリは、ソリューション レベルの共通フォルダーに存在する必要があり、各バージョンは異なるサブフォルダーにあります。
たとえば、ソースコードには
#if TFS2015 || TFS2015u1
using ILocationService = Microsoft.VisualStudio.Services.Location.Server.ILocationService;
#elif TFS2013
using ILocationService = Microsoft.TeamFoundation.Framework.Server.TeamFoundationLocationService;
#else
#error Define TFS version!
#endif
ソリューションにはDebug-2013
、コンパイル シンボルを定義TFS2013
し、MSBuild スニペットをインポートする構成があります。
<Reference Include="Microsoft.TeamFoundation.Server.Core, Version=12.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<SpecificVersion>True</SpecificVersion>
<HintPath>$(SolutionDir)References\2013\Microsoft.TeamFoundation.Server.Core.dll</HintPath>
</Reference>
正しいアセンブリ バージョンを指しています。同様のDebug-2015
構成は、TFS2015
コンパイル シンボルとインポートを定義します。
<Reference Include="Microsoft.TeamFoundation.Server.Core, Version=14.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
<HintPath>$(SolutionDir)References\2015\Microsoft.TeamFoundation.Server.Core.dll</HintPath>
</Reference>
現状のマイナス面
このソリューションの欠点は、参照フォルダーの管理です。すべての新しいクライアント マシンで、正しいファイルをコピーする必要があります。ビルド サーバーについても同様です。NuGet を使用してこの混乱を管理したいと考えています。
NuGet 試行 #1
.nuspec
私はファイルでこれを試しました
<files>
<file src=".\References\TfsReferences.target" target="content\References\TfsReferences.target" />
<file src=".\References\2013\*.dll" target="content\References\2013" />
<file src=".\References\2015\*.dll" target="content\References\2015" />
<file src=".\References\2015.1\*.dll" target="content\References\2015.1" />
<file src=".\References\2015.2\*.dll" target="content\References\2015.2" />
</files>
ただし、各プロジェクトで参照フォルダーの作成を終了し、条件付き参照を解決しません。