NuGet 包应支持哪些 .NET 版本以最大限度地提高其可用性和功能?

Which .NET versions should be supported by NuGet packages to maximize their availability and functionality?

TL;DR:


感想(旧版):

NuGet包支持multiple .NET Framework versions and profiles,例如一个包可以提供net20、net30、net35、net40、net45、sl3、sl4、sl5等版本。但是,假设 包的功能并不总是存在差异 ,提供大量版本会浪费构建时间和包大小,并导致不必要的复杂性。另一方面,仅为支持的最低框架版本提供包可能会导致功能缺失,例如 .NET 4 支持多个 CLR 版本的进程内并排执行,但以前的版本不支持,因此此功能如果仅提供 .NET 3.5 版本,将会丢失(我不确定;我从未使用过它,也不知道详细信息)。如果提供了 PCL 版本,我认为逻辑很简单:只排除 PCL 涵盖的版本。

您应该以 .net Framework 2.0 及更高版本为目标。该决定应基于应用程序将 运行 投入生产的平台。 .net 2.0 包含在 Windows 2008 服务器(SP2 及更高版本)中,人们仍在生产中广泛使用它。 参考 https://en.wikipedia.org/wiki/.NET_Framework

在撰写本文时,最简单的方法是创建一个 .NET Standard 1.1 项目。支持

  • .NET Core 1.0 及更高版本
  • .NET Framework 4.5 及更高版本
  • Mono、Xamarin、Windows Phone 和 more...

几乎所有的现代平台。如果你想支持旧平台,例如。 .NET Framework 3.0,将其作为单独的 "folder" 添加到 NuGet 中。这样,较新的 .NET Core 应用程序仍然可以使用您的包。


更多信息

.NET 标准替代了 PCL。您可以使用 PCL 定位的最低 .NET Framework 是 4.0,这并不比 .NET Standard 1.1 的 4.5 低很多(因此不会使您的包更易于访问)。

PCL 似乎也不支持 .NET Core,而 .NET Standard 几乎支持所有平台:

另请注意according to Microsoft, only .NET Framework 3.5 SP1 and .NET Framework >= 4.5.2 are currently supported。所有其他 .NET Framework 版本的生命周期都已结束,将不会获得任何更新。 Windows Phone 也死了,Silverlight 也没有任何进展。

正如 @Lex Li 在评论中提到的,.NET Standard 1.1 的 API 表面非常低,这意味着可能缺少一些重要的 API。因此,大多数 NuGet 包使用更高的 .NET Standard 版本。 建议尽可能使用最低的 .NET Standard 版本。

因此,对于 .NET Standard 1.1,您将支持绝大多数现代框架。遗憾的是,我找不到任何 .NET Framework 分布统计信息...


如果您真的想让您的软件包可用于每个 平台,请看一看at the possible target platforms for NuGet。我认为您至少需要 net11netstandard1.0,也许添加一些 Silverlight 和 .NET MicroFramework 支持...

如果您希望它不仅仅用于 Windows - .NET Standard 是必经之路。 Target latest 作为使用什么库的问题出现在项目的早期,很少被重新访问,新项目倾向于使用最新版本的框架和库。

您可以轻松找到基于互联网使用情况的用户设备的近期市场份额。

查看数字,选择您想要覆盖的平台,并将其与可用的 .NET 版本进行交叉引用。

以 .Net Standard 为目标将使您的 nuget 包可以在 .NET 框架、.NET 核心、mono、Xamarin、通用 Windows 平台和 Windows [=38= 中使用] 项目。

查看以下摘自此

要确定您应该定位哪个版本的 .Net 标准,请使用以下 table:

Source.

看看上面的内容 table 如果您关心 Windows Phone Silverlight,我建议您使用 .Net standard 1.0;如果您不关心,我建议您使用 .Net standard 1.2。

此外,据我所知,很多选择 .net core 的人实际上正在使用 .net core 2.0,因此您可能希望使用 .net standard 2.0 为他们创建一个单独的 nuget 版本。

关于你问题的第二部分,即使一个特定的框架已经死了并不意味着它会立即消失,它在完全死掉之前仍然会被使用几年,只是转向不同的选择需要时间。

我要考虑的另一件事是常用的库,如 Masstransit, EPPlus,以及常用的 IOC 等。我会大致了解一下它们支持的框架并遵循,因为许多正在进行的项目可能是由此类库驱动的。

2018年解决方案

基于给定的答案并假设不依赖于特定于平台的技术(如 System.Drawing、ASP.NET 或 WPF;在这种情况下,只需针对您可以使用的平台即可):

  1. netstandard1.0netstandard2.0 从 .NET Standard 1.0 开始,直到达到最大功能。

    这应该包括:

    • .NET Framework 4.5
    • .NET 核心 1.0
    • 单声道 4.6
    • Xamarin.iOS 10.0
    • Xamarin.Android 7.0
    • Windows 通用 10.0
    • Windows 非通用 8.0(最高 .NET Standard 1.2)
    • Windows Phone 8.1(达到 .NET Standard 1.2)
    • Windows Phone Silverlight 8.0(达到 .NET Standard 1.0)

    如果您不能在相对较小的.NET Standard 1.0–1.2 的范围内合理地实现该库,那么最后三点很可能会被排除在外。如果您仍然需要它们,请参阅以下要点。

    .NET Standard 1.5+ 增加了对框架和操作系统版本的要求,因此可能需要多目标 .NET Standard 版本以获得最大兼容性。

  2. portable-net40+*下一个要点已经过时PCL。它的 .NET Framework 4.5+ 版本不相关,因为它们大部分都包含在 .NET Standard 中。如果你想支持 Windows Phone 8 和非通用 Windows Store 8,你应该通过 PCL 来实现,除非你受到 API 的限制,在这种情况下,您必须添加特定于平台的目标。

    如果您不需要任何其他平台并且 .NET Framework 4.0 在 .NET 3.5 上提供了一些有用的附加功能,您可以直接针对它,而不是通过 PCL。

    这应该包括:

    • .NET Framework 4.0
    • Windows非通用8.0
    • Windows Phone 8.0
    • Windows Phone 银光 8.0
  3. net20net35 如果你想支持古老的桌面 Windows 版本(如 Windows XP)和未更新的更新 Windows 版本(如 Windows Vista+ 和 .NET 3.0+),您应该直接添加对桌面 .NET Framework 目标的支持。请注意,截至 2018 年 1 月 1 日,支持的最低 .NET 是 3.5 SP1,因此低于该版本可能是不必要的,并且可能会限制 API 对您的使用,而没有任何实际好处。

    这应该包括:

    • .NET 框架 2.0-3.5
    • Windows 经验值
  4. 还有其他平台,即 Xamarin 特定平台、Tizen、.NET Micro 等。只能通过直接定位它们来访问它们。

    这应该包括:

    • 其他一切

TL;DR

类似 netstandard1.1+portable-net40+win8+net35 的内容涵盖了所有相关平台。

未来的解决方案

当旧的 .NET 版本完全消亡时,应该只剩下 .NET Standard。好吧,除非 Microsoft 发明了另一种跨平台统一技术,就像它已经对 .NET、.NET PCL、.NET Standard...

所做的那样

TL;DR

尽可能使用最低的 netstandard