对于新的.NET项目格式,我还比较陌生,并且希望就如何最好地管理库的依赖关系征询一些意见。
假设我正在编写一个包含一些ASP.NET核心功能的库(打算作为NuGet包共享)。
在我的库的csproj文件中,我可以添加对Microsoft.AspNet.Core
的引用,并愉快地使用我想要的所有内容或任何其传递依赖项。
另一种方法是在我开始使用那些包中的类型时,为我使用的AspNet.Core的每个部分显式添加引用。例如,要在我第一次使用Microsoft.AspNetCore.Http.Abstractions
时添加对HttpContext
的程序包引用。
对我来说,后一种方法似乎更可取。它提供了有关程序包实际依赖关系的更清晰描述,并且与更新到可能从其传递依赖项中删除Microsoft.AspNet.Core
的版本时参考引用Microsoft.AspNetCore.Http.Abstractions
一样,不容易被破坏。图。
如果普遍共识确实是上述的后一种方法,那么是否有任何方法可以强制执行这种行为?例如,如果项目引用了传递依赖中的类型,则会使构建失败?
真的很想听听大家对此的想法!
答案 0 :(得分:1)
我是一位经验丰富的C#开发人员,还是多个NuGet软件包的维护者。尽管这些软件包实际上没有任何依赖性。
我同意,仅引用所使用的确切软件包的后一种方法是可取的。这有几个优点:
由于第三种情况,我最近不得不file a bug。 xUnit库在两个不同的软件包xunit.assert
和xunit.assert.source
中提供其断言。第二个功能使您可以使用自定义断言扩展断言类。我使用的是xunit.categories
软件包,它引用了xunit
,后者引用了包括xunit.assert
在内的几个软件包。因此,当我尝试切换为使用xunit.assert.source
时,我遇到了冲突,因为它们包含相同的类。但是,xunit.categories
甚至不使用xUnit的断言部分。它应该仅引用xunit.core
。
答案 1 :(得分:0)
我想我更喜欢显式引用包。但是,我可以理解答案可能是主观的。
在任何情况下,都有一个工具可帮助您找到可传递的程序包引用: