NuGet中的传递性包引用的最佳做法

时间:2019-04-24 07:41:19

标签: c# .net .net-core msbuild

对于新的.NET项目格式,我还比较陌生,并且希望就如何最好地管理库的依赖关系征询一些意见。

假设我正在编写一个包含一些ASP.NET核心功能的库(打算作为NuGet包共享)。

在我的库的csproj文件中,我可以添加对Microsoft.AspNet.Core的引用,并愉快地使用我想要的所有内容或任何其传递依赖项。

另一种方法是在我开始使用那些包中的类型时,为我使用的AspNet.Core的每个部分显式添加引用。例如,要在我第一次使用Microsoft.AspNetCore.Http.Abstractions时添加对HttpContext的程序包引用。

对我来说,后一种方法似乎更可取。它提供了有关程序包实际依赖关系的更清晰描述,并且与更新到可能从其传递依赖项中删除Microsoft.AspNet.Core的版本时参考引用Microsoft.AspNetCore.Http.Abstractions一样,不容易被破坏。图。

如果普遍共识确实是上述的后一种方法,那么是否有任何方法可以强制执行这种行为?例如,如果项目引用了传递依赖中的类型,则会使构建失败?

真的很想听听大家对此的想法!

2 个答案:

答案 0 :(得分:1)

我是一位经验丰富的C#开发人员,还是多个NuGet软件包的维护者。尽管这些软件包实际上没有任何依赖性。

我同意,仅引用所使用的确切软件包的后一种方法是可取的。这有几个优点:

  1. 通过减少您要提取的软件包的数量来帮助防止程序集版本之间的冲突
  2. 最小化使用您的软件包为项目添加的总大小
  3. 可以为您的包裹用户启用高级方案

由于第三种情况,我最近不得不file a bugxUnit库在两个不同的软件包xunit.assertxunit.assert.source中提供其断言。第二个功能使您可以使用自定义断言扩展断言类。我使用的是xunit.categories软件包,它引用了xunit,后者引用了包括xunit.assert在内的几个软件包。因此,当我尝试切换为使用xunit.assert.source时,我遇到了冲突,因为它们包含相同的类。但是,xunit.categories甚至不使用xUnit的断言部分。它应该仅引用xunit.core

答案 1 :(得分:0)

我想我更喜欢显式引用包。但是,我可以理解答案可能是主观的。

在任何情况下,都有一个工具可帮助您找到可传递的程序包引用

https://github.com/spectresystems/snitch