如何为 nuget 包构建具有多个 .net 框架的项目

Emr*_*DUR 1 c# dll publish frameworks nuget

我正在 github 上开发一个项目并发布到 nuget。当我创建每个版本时,我必须构建多个 .net 框架并将这些 dll 用于 nuget 包。有没有一种简单的方法来发布所有这些 .net 框架版本?谢谢你。

ziv*_*kan 7

  1. 目标框架名称 (TFM) 兼容性

存在 TFM 兼容性。通常,较低版本的 TFM 系列与较高版本兼容。因此,.NET Framework 4.7 程序集可用于面向 .NET Framework 4.7.1、4.7.2 或 4.8 的项目。同样,面向 .NET Standard 1.2 的 NuGet 包可用于面向 .NET Standard 2.0 的项目。

.NET Standard 也很特别。它不是运行时,而是运行时实现的规范。就像.NET Standard 上的文档所说,虽然 .NET 4.6.1 被标记为与 .NET Standard 2.0 及以下版本兼容,但还是存在问题,因此建议至少使用 .NET Framework 4.7.2 或 4.8 正在使用的包或项目引用,目标是 .NET Standard。

最后,.NET Core 的运行时netcoreapp和 .NET Framework之间的 API 有很大的重叠。因此,即使存在不兼容性,为了允许 .NET Core 应用程序使用可能不兼容的 NuGet 包,.NET Core SDK 2.0 引入了一个称为目标回退的概念。如果项目与包不直接兼容,如果包支持目标回退 TFM 之一,NuGet 将允许它,并显示警告。它可能会在运行时失败,因此会发出警告,但它可能会起作用。这对于 .NET Core 3.0 更为重要,开发人员在 WPF 和 WinForms 中编写桌面应用程序,希望使用提供桌面功能的 .NET Framework NuGet 包。

总之,您可能不需要创建面向多个 TFM 的 NuGet 包。只需选择具有您需要的 API 的最低 TFM,以它为目标,并让 TFM 兼容性使其发挥作用。但是,如果您想使用仅在较新的 TFM 中可用的 API,同时仍支持较旧的 TFM,那么您将需要多目标您的项目和包,但同样,您可以最大限度地减少您需要支持的 TFM 数量。你的包不需要netstandard1.0netstandard1.1netstandard1.2netstandard1.3netstandard2.0netstandard2.1TFMS。

  1. 使用 SDK 风格的项目

假设您使用 Visual Studio 进行开发,请安装 .NET Core 工作负载,即使您不打算进行跨平台(Linux、Mac)开发。使用 .NET Core,项目文件变得更加简单,同时功能更加强大,包括针对单个项目文件中的多个 TFM 的内置支持。以前,csproj您需要在包中为您想要的每个 TFM创建一个,编译每个项目,然后nuspec将所有内容拉入正确的位置。现在,简单的有一个csproj列出您想要定位的所有 TFM,并运行dotnet pack(不要创建 nuspec,包元数据来自 MSBuild 属性)。

因此,安装 .NET Core SDK 后,您可以从 Visual Studio 创建 .NET Standard 类库,也可以dotnet new classlib在命令行上运行。如果您想以 .NET Framework 为目标,创建 .NET Standard 类库并不重要,因为这就是您获得 SDK 样式项目的方式。.NET Framework 类库项目模板使用不支持多目标的非 SDK 样式项目。然后编辑csproj并更改<TargetFramework>netstandard2.0</TargetFramework><TargetFrameworks>net472;netstandard2.0</TargetFrameworks>。请注意,TargetFramework(单数)变成了TargetFrameworks(复数),并且 XML 元素的内容是以分号分隔的您希望项目定位TFM列表)。

csproj是您可以开始的完整示例:

<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <TargetFrameworks>net472;netstandard2.0</TargetFrameworks>
    <CheckForOverflowUnderflow>true</CheckForOverflowUnderflow>
  </PropertyGroup>

</Project>
Run Code Online (Sandbox Code Playgroud)

如前所述,一旦你有一个csproj看起来像这样,只需运行dotnet pack命令行(你也可以用鼠标右键单击在Visual Studio的解决方案资源管理器中的项目,并选择包),你会得到一个nupkgnet472netstandard2.0编译的程序集在包装中的正确位置。