繁体   English   中英

如何在VS 2017中创建具有最小依赖性的.NET Standard NuGet包?

[英]How to create .NET Standard NuGet package with minimal dependencies in VS 2017?

我目前正在使用Visual Studio 2017迁移库项目以支持.NET Standard 1.1。

我希望将该项目作为单个NuGet包发布,该包可以同时针对.NET Framework 4.5+和.NET Core,UWP等。

但是,当我尝试在.NET Framework项目中安装生成的包时,会生成一个包含.NET标准中定义的所有包的大量包依赖关系(见下文):

在.NET 4.5项目上安装后的程序包依赖关系。

据我所知,这些都是作为.NET Standard 1.1规范的一部分定义的程序集。 但是,我的特定项目实际上只需要它们中的一小部分,并且对于在项目中安装包的任何人来说,这种依赖性列表将非常混乱。

我试图按照类似问题的答案,其中建议是更改项目规范以仅引用项目所需的确切依赖项。

但是,答案是在旧的project.json格式的上下文中,现在已经被VS 2017中的新.csproj格式所取代。我试图通过删除<TargetFramework>来删除对.NET Standard 1.1元数据包的依赖性。指令,但我只是设法破坏了构建,无法找到任何方法专门添加所需的依赖项。

将库迁移到.NET Standard以实现最大平台兼容性的承诺极具吸引力,但建议依赖性的方法是什么,以便针对“经典”.NET Framework的项目找不到所有这些依赖项“污染”的项目?

<TargetFramework>更改为<TargetFrameworks>并添加;net45 您仍然可以获得单个NuGet包输出,但现在如果您的目标是.NET核心应用程序(已经具有依赖项),它将只会引入额外的依赖项。

首先,我想指出 ,这主要是设计时的问题,不影响所产生的应用程序和库的可移植性:

在过去,我们已经给开发人员建议不要从NuGet包中引用元包( NETStandard.Library ),而是引用单个包,如System.RuntimeSystem.Collections 理由是我们认为元包是一堆软件包的简写,这些软件包是.NET平台的实际原子构建块。 假设是:我们可能最终创建另一个.NET平台,它只支持其中一些原子块,但不支持所有这些原子块。 关于我们的工具如何处理大包图也存在顾虑。

展望未来,我们将简化这一点:

  1. .NET Standard是一个原子构建块 换句话说,新平台不允许使用.NET Standard - 他们必须实现所有这些。

  2. 我们正在逐渐不使用包来描述我们的平台 ,包括.NET Standard。

这意味着,您不必再为.NET Standard引用任何NuGet包。 您表达了对lib文件夹的依赖关系,这正是它对所有其他.NET平台,特别是.NET Framework的工作方式。

但是,现在我们的工具仍然会在对NETStandard.Library的引用中NETStandard.Library 这也没有任何害处,它将变得多余的向前发展。

但是,我完全承认这一结果几乎不可取。

使用.NET Standard 1.x和packages.config ,您不得不选择生成带有自定义依赖关系组的手写.nuspec。 但是,这需要了解哪些包是必需的并且往往是脆弱的。 如果消费者使用<PackageReference>它稍微不那么令人头疼,因为它将直接参考文献与传递参考文献分开,因此这些并不是你脸上的那么多。

使用.NET Standard 2.0,问题将完全消失。

如果你查看net45的那些包引用,你会发现没有实际的DLL加载。 包就在那里,运行时如coreclr加载BCL的所有部分就像dll一样可以得到它们。 但是在net45中,你实际上并没有在这些包中找到任何dll。

简而言之,在.net 4.x中,.net仍将使用GAC来加载这些程序集。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM