为多个.NET Framework版本创建NuGet包

4

我正在开发一个库,想为多个版本的.NET Framework创建NuGet包。我没有找到任何完整的操作列表的文章。

我尝试了第一种选择,创建了一组配置,如Release_Net45等。然后我编辑了csproj文件,将输出目录(lib/net45等)和每个配置的目标框架版本进行了更正。然后我构建了每个配置。之后我运行了nuget pack,并且成功创建了包,但是有一个警告说一个dll没有被添加,因为它已经在包中了...

然后我尝试编辑csproj文件,向与Release配置相对应的PropertyGroup中包括TargetFrameworks元素和元素以提供包元数据。编辑后重新加载项目时,在解决方案资源管理器中出现了一个名为Dependencies的新组。我尝试使用Developer Command Prompt中的msbuild /t:pack /p:Configuration=Release创建包,但是这个过程以错误结束,提示没有pack目标。为了解决这个问题,我添加了NuGet.Build.Tasks.Pack包,之后就可以构建包了。但是当我查看配置管理器时,我的配置突然变得损坏了。

我没有预料到为多个目标框架设置包会如此痛苦 :( 什么是正确的方法?有没有完成此任务的完整指南?

1个回答

6

TargetFramework / TargetFrameworks 属性仅支持基于SDK的项目。目前,只有.NET Standard、.NET Core和ASP.NET Core项目的项目模板使用此基于SDK的项目格式。因此,您可以创建一个.NET Standard库,然后编辑csproj文件(右键单击项目 > 编辑)。

最简单的示例如下:

<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    <TargetFrameworks>net45;net461</TargetFrameworks>
  </PropertyGroup>
</Project>

注意观察 Sdk 属性的存在,它提供了许多默认值和额外的构建逻辑。您不需要在文件夹结构中指定任何 .cs 文件,并且可以使用项目的属性页面来设置与 NuGet 相关的属性。
在您的情况下显示依赖项节点的原因是 VS 2017 针对 .NET 项目提供了两个不同的项目系统 - 经典项目系统已经存在于 VS 中很长时间,以及基于新项目系统模型 (CPS) 开发的新项目系统,该系统还不支持所有经典项目系统的功能,但具有新的依赖项模型、NuGet 属性页面和在加载项目时编辑项目文件的支持等其他功能。选择要加载的项目系统取决于项目文件中是否存在 TargetFrameworkTargetFrameworks

谢谢您的解释。那么,为.NET Framework设置一个项目以便打包多个目标框架的正确方法是什么? - Maxim
目前还没有公开记录的文档。您可以将我发布的代码复制到 xyz.csproj 文件中,并在 Visual Studio 中打开它以开始使用。从经典 csproj 迁移到基于 SDK 的 csproj 也没有很好的迁移方案 - 大多数情况下需要手动编辑 csproj 文件(并且需要知道该怎么做)。 - Martin Ullrich
1
但它的效果非常好,Newtonsoft.Json也使用了这种方法,并通过自定义逻辑扩展它,以允许为可移植类库构建。 - Martin Ullrich
好的...是的,看看其他项目的csproj文件似乎是理解如何准备库以打包成NuGet包的最快方法。 - Maxim
2
我终于解决了我的任务。在传统的.NET Framework中,可以切换到新的csproj格式。这篇文章对我帮助很大。 - Maxim
请注意,您的项目可能有TargetFrameworkVersion标签,它不支持多个框架,并将导致在加载项目时出现(...) GetPathToStandardLibraries(.NETFramework, netstandard1.4;net40;net45, '', '', '', '')"无法评估。输入字符串格式不正确。因此,请确保将此标记重命名为TargetFrameworks。花了我一个小时才找到这个问题 D': - nozem

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接