Nuget 取决于元包的netstandard库的应用程序含义是什么?

Nuget 取决于元包的netstandard库的应用程序含义是什么?,nuget,.net-core,.net-standard,Nuget,.net Core,.net Standard,假设我有一个类库,目标是netstandard1.3,但也要使用BigInteger。下面是一个简单的示例-唯一的源文件是Adder.cs: 使用系统; 使用系统数字; 名称空间计算器 { 公共类加法器 { 公共静态大整数加法(整数x,整数y) =>新的大整数(x)+新的大整数(y); } } 回到project.json的世界,我会在frameworks一节中以netstandard1.3为目标,并明确依赖于System.Runtime.Numerics,例如4.0.1版。我创建的nuget

假设我有一个类库,目标是netstandard1.3,但也要使用
BigInteger
。下面是一个简单的示例-唯一的源文件是
Adder.cs

使用系统;
使用系统数字;
名称空间计算器
{
公共类加法器
{
公共静态大整数加法(整数x,整数y)
=>新的大整数(x)+新的大整数(y);
}
}
回到
project.json
的世界,我会在
frameworks
一节中以
netstandard1.3
为目标,并明确依赖于
System.Runtime.Numerics
,例如4.0.1版。我创建的nuget包将只列出该依赖项

在基于csproj的dotnet工具的全新世界中(我正在使用命令行工具的v1.0.1),当目标是
netstandard1.3
时,有一个to
NETStandard.Library 1.6.1
。这意味着我的项目文件非常小,因为它不需要显式依赖关系:


netstandard1.3
。。。但是生成的nuget包依赖于
NETStandard.Library
,这表明为了使用我的小型库,您需要那里的一切

事实证明,我可以使用
DisableImplicitFrameworkReferences
禁用该功能,然后再次手动添加依赖项:


netstandard1.3
真的
现在,我的NuGet包确切地说明了它所依赖的内容。直觉上,这感觉像是一个“更精简”的包

那么,对于我的图书馆的消费者来说,确切的区别是什么呢?如果有人试图在UWP应用程序中使用它,那么第二种“修剪”形式的依赖项是否意味着生成的应用程序将更小


通过不清楚地记录
DisableImplicitFrameworkReferences
(据我所见,我已经读过),并在创建项目时将隐式依赖项设为默认值,微软鼓励用户只依赖元软件包——但我如何确保在生成类库软件包时不会有缺点呢?

团队曾经建议找出最瘦的软件包集是什么。他们不再这样做,建议人们只引入NETStandard.Library(对于SDK风格的项目,这将自动为您完成)

我从来没有得到过一个完全直截了当的答案,所以请允许我做一些有根据的猜测

主要原因可能是,它允许它们隐藏依赖库版本的差异,否则在更改目标框架时,您需要跟踪自己。它也是一个用户友好得多的系统,带有基于SDK的项目文件,因为坦率地说,您不需要任何引用就可以获得平台的适当部分(就像您过去在Desktop land中使用默认引用一样,尤其是mscorlib)

通过将
netstandard
库或
netcoreapp
应用程序的元定义推入适当的NuGet包,他们不必像Visual Studio(或
dotnet new
)所看到的那样,在这些东西的定义中构建任何特殊的知识

在发布过程中可以使用静态分析来限制附带的DLL,这是他们今天在为UWP进行本机编译时所做的事情(尽管有一些警告)。他们今天没有为.NETCore这样做,但我认为这是他们考虑过的优化(以及支持本机代码)


如果你愿意的话,没有什么能阻止你的选择性。我相信你会发现你几乎是唯一一个这样做的人,这也违背了目的(因为假设每个人都引入了
NETStandard.Library
Microsoft.NETCore.App
)。

你不应该禁用隐式引用。库能够在其上运行的所有平台都已具有
NETStandard.library
依赖项所需的程序集

NET标准库是一种规范,是一组参考程序集,您可以根据这些程序集进行编译,这些程序集提供一组API,这些API保证存在于一组已知的平台和平台版本上,如.NET Core或.NET Framework。它不是这些程序集的实现,只是足够的API形状,允许编译器成功地构建代码

这些API的实现由目标平台提供,如.NETCore、Mono或.NETFramework。它们与平台一起装运,因为它们是平台的重要组成部分。因此,不需要指定一个较小的依赖项集-所有内容都已经存在,您不会更改它

NETStandard.Library
包提供了这些参考程序集。一个混淆点是版本号-软件包是版本1.6.1,但这并不意味着“.NET标准1.6”。这只是软件包的版本

目标.NET标准的版本来自您在项目中指定的目标框架

如果您正在创建一个库,并希望它在.NET标准1.3上运行,那么您应该参考
NETStandard.library
包,该包目前的版本是1.6.1。但更重要的是,项目文件的目标是
netstandard1.3

根据您的目标框架名字对象,
NETStandard.Library
包将为您提供一组不同的引用程序集(为了简洁起见,我将进行简化,但考虑
lib\netstandard1.0
lib\netstandard1.1
和)。因此,如果您的项目目标是
netstandard1.3
,那么您将获得1.3参考程序集。如果您的目标是
netstandard1.6
,您将获得1.6参考程序集

如果您正在创建应用程序,则