NuGet 包应支持哪些 .NET 版本以最大限度地提高其可用性和功能?
Which .NET versions should be supported by NuGet packages to maximize their availability and functionality?
TL;DR:
鉴于:我编写了一个具有相对可移植功能的库(例如,Left.Pad.©.dll
)。我想通过 NuGet 使其可用。
要求:如果有人想在 any 版本的 any 平台上使用我的库 any 版本的 any 操作系统,通过在 any[=46= 中编写代码安装 any 更新] IDE或任何代码编辑器,他们应该都能做到。
问题:最小 集 NuGet target frameworks 是什么?
奖励问题:如果有任何"dead"框架不应该作为目标,或者在选择目标框架时应该考虑的其他事情,你也可以提出来.
感想(旧版):
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。我认为您至少需要 net11
和 netstandard1.0
,也许添加一些 Silverlight 和 .NET MicroFramework 支持...
如果您希望它不仅仅用于 Windows - .NET Standard 是必经之路。 Target latest 作为使用什么库的问题出现在项目的早期,很少被重新访问,新项目倾向于使用最新版本的框架和库。
What .NET Standard versions are supported by what versions of other frameworks (GitHub).
What .NET Framework versions are supported by which Windows Server versions(微软文档)。
Server version share in SpiceWork network。 它不代表全球数据,但它是我发现的了解 Windows 服务器市场份额的最佳数据。
您可以轻松找到基于互联网使用情况的用户设备的近期市场份额。
查看数字,选择您想要覆盖的平台,并将其与可用的 .NET 版本进行交叉引用。
以 .Net Standard 为目标将使您的 nuget 包可以在 .NET 框架、.NET 核心、mono、Xamarin、通用 Windows 平台和 Windows [=38= 中使用] 项目。
查看以下摘自此
要确定您应该定位哪个版本的 .Net 标准,请使用以下 table:
看看上面的内容 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;在这种情况下,只需针对您可以使用的平台即可):
netstandard1.0
—netstandard2.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 版本以获得最大兼容性。
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
net20
—net35
如果你想支持古老的桌面 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 经验值
还有其他平台,即 Xamarin 特定平台、Tizen、.NET Micro 等。只能通过直接定位它们来访问它们。
这应该包括:
- 其他一切
TL;DR
类似 netstandard1.1
+portable-net40+win8
+net35
的内容涵盖了所有相关平台。
未来的解决方案
当旧的 .NET 版本完全消亡时,应该只剩下 .NET Standard。好吧,除非 Microsoft 发明了另一种跨平台统一技术,就像它已经对 .NET、.NET PCL、.NET Standard...
所做的那样
TL;DR
尽可能使用最低的 netstandard
。
TL;DR:
鉴于:我编写了一个具有相对可移植功能的库(例如,
Left.Pad.©.dll
)。我想通过 NuGet 使其可用。要求:如果有人想在 any 版本的 any 平台上使用我的库 any 版本的 any 操作系统,通过在 any[=46= 中编写代码安装 any 更新] IDE或任何代码编辑器,他们应该都能做到。
问题:最小 集 NuGet target frameworks 是什么?
奖励问题:如果有任何"dead"框架不应该作为目标,或者在选择目标框架时应该考虑的其他事情,你也可以提出来.
感想(旧版):
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。我认为您至少需要 net11
和 netstandard1.0
,也许添加一些 Silverlight 和 .NET MicroFramework 支持...
如果您希望它不仅仅用于 Windows - .NET Standard 是必经之路。 Target latest 作为使用什么库的问题出现在项目的早期,很少被重新访问,新项目倾向于使用最新版本的框架和库。
What .NET Standard versions are supported by what versions of other frameworks (GitHub).
What .NET Framework versions are supported by which Windows Server versions(微软文档)。
Server version share in SpiceWork network。 它不代表全球数据,但它是我发现的了解 Windows 服务器市场份额的最佳数据。
您可以轻松找到基于互联网使用情况的用户设备的近期市场份额。
查看数字,选择您想要覆盖的平台,并将其与可用的 .NET 版本进行交叉引用。
以 .Net Standard 为目标将使您的 nuget 包可以在 .NET 框架、.NET 核心、mono、Xamarin、通用 Windows 平台和 Windows [=38= 中使用] 项目。
查看以下摘自此
要确定您应该定位哪个版本的 .Net 标准,请使用以下 table:
看看上面的内容 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;在这种情况下,只需针对您可以使用的平台即可):
netstandard1.0
—netstandard2.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 版本以获得最大兼容性。
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
net20
—net35
如果你想支持古老的桌面 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 经验值
还有其他平台,即 Xamarin 特定平台、Tizen、.NET Micro 等。只能通过直接定位它们来访问它们。
这应该包括:
- 其他一切
TL;DR
类似 netstandard1.1
+portable-net40+win8
+net35
的内容涵盖了所有相关平台。
未来的解决方案
当旧的 .NET 版本完全消亡时,应该只剩下 .NET Standard。好吧,除非 Microsoft 发明了另一种跨平台统一技术,就像它已经对 .NET、.NET PCL、.NET Standard...
所做的那样TL;DR
尽可能使用最低的 netstandard
。