.net core 库是否应该明确以.NET Core 3为目标?

.net core 库是否应该明确以.NET Core 3为目标?,.net-core,nuget,nuget-package,.net-core-3.0,.net Core,Nuget,Nuget Package,.net Core 3.0,随着.NET标准2.0的发布,建议将目标定为.NET标准2.0,即使您已经将目标定为1.x : 但是,针对较低的.NET标准版本会引入许多支持依赖项。如果您的项目以.NET标准1.x为目标,我们建议您也以.NET标准2.0为目标。这简化了运行在.NET标准2.0兼容框架上的库用户的依赖关系图,并减少了他们需要下载的包的数量 现在又一个大的变化就要到来了。NET Core 3,我看到Microsoft也将.NET Core 3作为Microsoft软件包的目标 例如,目标是.NET标准2.0和.N

随着.NET标准2.0的发布,建议将目标定为.NET标准2.0,即使您已经将目标定为1.x

:

但是,针对较低的.NET标准版本会引入许多支持依赖项。如果您的项目以.NET标准1.x为目标,我们建议您也以.NET标准2.0为目标。这简化了运行在.NET标准2.0兼容框架上的库用户的依赖关系图,并减少了他们需要下载的包的数量

现在又一个大的变化就要到来了。NET Core 3,我看到Microsoft也将.NET Core 3作为Microsoft软件包的目标

例如,目标是.NET标准2.0和.NET核心3(.NETCoreApp 3.0):

我比较了XML文件,两个API看起来都一样(可能不是比较它们的最佳方式)

现在是问题;)

作为依赖Microsoft.Extensions.Logging的库维护人员,尝试支持.NET Core 3:
如果我不需要.NET Core 3的特定内容,我是否也应该以.NET Core 3为目标?或者仅仅是.NET Standard 2.0就足够了

如果您不想使用.NET Core 3中的任何内容,或者不想提供任何.NET Core 3优化,则不必以.NET Core 3为目标。另一方面,双重目标不需要花费任何成本,并且可以让您摆脱现在内置在.NETCore3中的库引用。至少,您可以摆脱运行时附带的一些库引用

  <ItemGroup Condition="'$(TargetFramework)' == 'netstandard2.0'">
    <Reference Include="System.Text.Json" />
    <Reference Include="System.Threading.Tasks.Extensions" />
  </ItemGroup>
长答案

这完全取决于你在做什么,你想做什么。库不必仅仅因为其依赖项将.NET Core 3.0包含在其目标中而以.NET Core 3.0为目标

例如,
Microsoft.Extensions.Logging
似乎没有任何特定于C#8/.NET核心3.0的代码。它的目标是3.0,因为它是扩展浪潮的一部分,所以双重目标不需要任何修改

另一方面,不必引用
System.Text.Json
System.Threading.Tasks.Extensions
,因为它们是运行时的一部分

  <ItemGroup Condition="'$(TargetFramework)' == 'netstandard2.0'">
    <Reference Include="System.Text.Json" />
    <Reference Include="System.Threading.Tasks.Extensions" />
  </ItemGroup>
这是一个小但非常方便的添加。它允许您通过以下方式接收消息:

await foreach(var msg from reader.ReadAllAsync())
{
   ....
}

另一方面,NRTs甚至对.NET Standard 2.0也有帮助,因为在编译.NET Core 3.0时,NRTs可以帮助您捕获源代码中的可空性错误。

当有人安装包时,NuGet使用TFM中与项目TFM最匹配的资产。它也对可传递依赖项执行此操作

例如,如果项目目标netcore30和包A在lib/netcore30和lib/netstandard20下有资产,nuget将选择lib/netcore30。假设包A依赖于B,包B有netstandard20的资产,net472,nuget将选择netstandard20

底线是,nuget将为图中的每个包选择最佳匹配的资产。因此,作为库维护者,您不需要添加两个TFM来支持netcore30。您可以将netstandard21作为目标,这意味着基于此文档支持netcore30

作为依赖于 Microsoft.Extensions.Logging,正在尝试支持.NET Core 3的用户: 我应该也瞄准.NETCore3吗?还是仅仅是.NETStandard2.0好 如果我不需要.NETCore3的特定内容,就足够了吗

只要库中的所有依赖项都以.NET标准2.0为目标,包括
Microsoft.Extensions.Logging
,那么将.NET标准2.0作为目标就足够了

同样,为您的库的消费者确定.NET Core 3.0的目标可能会有好处,因此,如果是这样,并且成本不会太高,那么除了.NET标准2.0之外,一定要确定.NET Core 3.0的目标

同样,nuget将始终为图中的每个包选择最佳匹配的资产。i、 e

  • 应用程序A使用您的库并以.NET Core 3.0为目标。您的库仅针对.NET标准2.0。努吉会用的,没关系
  • 应用程序A使用您的库并以.NET Core 3.0为目标。您的库同时面向.NET标准2.0和.NET核心3.0。NuGet将选择.NETCore3.0

但好处并不存在,我是否也需要针对较旧的平台?我想我不能将c#8语法用于.net标准2。0@Julian我贴了一个例子,说明你如何做到这一点。在任何情况下,如果您不想以.NETCore3为目标,您不必这样做。日志库不会强迫您执行soOk。但不幸的是,这并不能回答我的问题question@Julian问题是什么?你希望答案是什么样的?即使某个依赖项将.NET Core 3包含在其目标中,您也不必将其作为目标。如果您不需要.NET Core 3中的任何内容,则无需以iTunes为目标。这无法回答Microsoft.Extensions.Logging为什么以netstandard2.0+netcore3.0为目标,以及依赖库应该做什么。@Julian依赖库不需要支持.NET Core 3(如果不需要)。在.NET Core 2.1或.NET Framework 4.8中构建使用Microsoft.Extensions.Logging的应用程序的人每次升级软件包时都会获得最新的NuGet软件包,而不必切换到.NET Core 3。恐怕这并不能回答我的问题。是否有任何理由将目标定为
.NET Core 3.0
而不是
.NET Standard2.1