如何设置Visual Studio 2013项目以构建针对多个.Net版本的nuget包?

时间:2015-12-04 18:23:27

标签: visual-studio nuget

我们有几个不同的团队使用Visual Studio构建C#应用程序。当我们想要跨团队共享库时,我们为库创建nuget包并将它们添加到本地nuget feed。

我们用来封装库的过程非常简单:我们为库创建一个.nuspec,然后在项目.csproj上运行nuget来创建包。

这会生成一个特定于为项目的.csproj选择的.Net版本(4.0,4.5,4.5.1)的包。为了解决这个问题,我们已经将4.5标准化了。

许多公开发布的nuget软件包同时支持不同的库版本,我们希望我们的软件包能够轻松地为每个团队选择适合他们的.Net版本。我知道原则上如何以这种方式构建一个包 - 但它涉及将文件移动到不同的文件夹并在较低级别调用nuget包装器。我不知道如何以一种可以在我们的团队中轻松获取的方式实现自动化。

所以我的问题是:是否有一种在Visual Studio中设置库项目的简单/标准方法,因此它可以生成与交叉版本兼容的Nuget包?

2 个答案:

答案 0 :(得分:2)

不是你问题的直接答案,我知道这一点,但是......

为什么要根据框架的多个版本?

  

当NuGet安装具有多个程序集版本的程序包时,它   尝试将程序集的框架名称与目标进行匹配   项目框架。如果找不到匹配项,NuGet会复制   对于小于或等于的最高版本的程序集   项目的目标框架。

Matching assembly version to the target framework of a project

我们所做的就是弄清楚我们的图书馆和组织的最低共同点是什么。在我们的例子中,我们有一些旧的应用程序仍在3.5框架上运行,因此任何需要可用于任何/所有项目的NuGet包也都以3.5框架为目标。但是,我们还有一些只有一些较新的应用程序需要的库,这些目标是4.5(项目和库)。这让我们可以利用更新的功能。

如果我们发现自己处于旧应用需要引用必须引用最新版本工作的软件包的情况下,我们会咬紧牙关并升级项目。但是,对于我们的库/包,我们始终以最旧版本为目标。基本上,拆分是我们想要/需要利用Async / Await的地方。

TL; DR:不要针对多个框架。瞄准最低公分母。它提供了升级那些落后于3.5或4的应用程序的动力。(或者,上帝禁止,2.0 ......)

答案 1 :(得分:2)

如果您确实需要支持不同的框架版本,首先必须使用配置管理器为每个框架版本(在.csproj文件中)创建不同的配置。与标准配置“Debug”和“Release”或“x86_Debug”等类似,您可以自己添加配置,如Release_Fw_40,Release_Fw_45,Release_Fw_451。

使用Nuget打包时,您可以使用参数

   -Prop Configuration=Release_Fw_40

选择要构建的配置,如in the Nuget docs所述。还有一些提示如何自动化包构建,包括支持不同的配置。

请注意,这将为您的图书馆维护人员管理这些配置带来一些额外的努力。显而易见的是,即使您提供了lib的“Fw 4.5.1”版本,只要您想支持Fw 4.0配置,您只能在源代码中使用Fw 4.0功能。因此,请确保您所尝试的内容真的值得麻烦。

  

我原则上知道如何以这种方式构建一个包 - 但它涉及将文件移动到不同的文件夹并在较低级别调用nuget packager。我不知道如何以一种可以在我们的团队中轻松获取的方式实现自动化

我不确定你的意思是什么,也许我只告诉你你已经知道的事情。但是“将文件移动到不同的文件夹”和“在较低级别调用nuget打包器”是可以非常容易编写脚本的东西。对于此类任务,您可以使用简单的Windows shell脚本或Powershell脚本,无论您喜欢什么。