我有一个带有一组复杂程序集引用的 Visual Studio 解决方案(TFS Aggregator),我希望使用 NuGet 来解决它。参考取决于目标配置,而不是 .Net 平台。
问题定义
该解决方案有许多项目,其中大多数都引用一组通用程序集。有不同的程序集版本公开 API 更改。源代码包含分散的条件编译#ifs来管理版本的差异。因此项目和解决方案有许多配置;项目参考根据配置而变化。
当前状态
正如您在源代码中看到的那样,每个项目都会导入一个通用的 MSBuild 文件,使用 Choose来做一些魔术。引用程序集必须位于解决方案级别的公共文件夹中,每个版本位于不同的子文件夹中。
例如,源代码包含
#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>
但它结束在每个项目上创建一个 Reference 文件夹并且不解决条件引用。