我有一个Visual Studio解决方案(TFS Aggregator),其中包含一组复杂的程序集引用,我希望使用NuGet解决它。引用取决于目标配置,而不是.Net平台。
问题定义
解决方案包含许多项目,其中大多数都引用了一组通用程序集。有不同的程序集版本公开API更改。源代码包含分散的conditional compiles #ifs以管理版本的差异。因此,项目和解决方案有许多配置;项目参考因配置而异。
当前状态
每个项目都会导入一个常见的MSBuild文件 Choose,正如您在the source中看到的那样。 引用程序集必须位于解决方案级别的公共文件夹中,每个版本位于不同的子文件夹中。
例如,源代码包含
#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>
当前状态的缺点
此解决方案的缺点是管理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文件夹,但没有解决条件引用。