在一个项目中引用使用了NuGet包的程序集同时该项目也使用了这些包。

8

我有一个复杂的库A,它由几个C#项目组成,产生以下程序集:

  • A.Core
  • A.Caching
  • A.Logging
  • A.MongoDb

这个库是我编写的,并且我可以完全访问其源代码。 它依赖于几个NuGet包,假设它们是:

  • mongocsharpdriver
  • EnterpriseLibrary.Caching
  • EnterpriseLibrary.Logging

这些库(MongoDb驱动程序和EntLib)未安装在GAC中。

我还有一个Web项目B,我想在其中将库A作为DLL引用使用(不包括在解决方案B中的项目)。 该Web项目依赖于几个NuGet包,其中包括:

  • mongocsharpdriver
  • EnterpriseLibrary.Logging

这些软件包在解决方案AB中的版本不匹配,因为它们不是同步开发的。自一年前开发了库A以来,一直按原样使用。

问题:分发库A的正确方法是什么?

  1. 任何解决方案都可以使用它,即使lib A的依赖关系未被引用。
  2. 如果一个解决方案有自己版本的库A的依赖项,则它们不会产生冲突。

我的当前方法:

  1. 从我的解决方案中,我引用四个dll:A.Core, A.Caching, A.Logging, A.MongoDb
  2. 然后,如果它们不存在,则将其所有NuGet依赖项添加到解决方案中。
  3. 有时会出现问题,因为解决方案B使用mongocsharpdriver版本1.5,而lib A使用版本1.1(版本不太兼容)。

那么,我该怎么做呢? 如何正确处理“引用与引用的引用之间的冲突”?

1个回答

7
最佳的管理共享引用的方式是为库A创建自己的NuGet包,其中定义了库A所依赖的任何依赖项(包括版本)。如果您不想将库A发布到公共NuGet feed中,可以托管自己的feed。
NuGet有一些复杂的依赖关系解析规则,它会尝试查找与您的项目及其依赖项兼容的依赖项版本。不幸的是,这仍然无法解决您在第3点中遇到的问题,即您的解决方案及其依赖库使用相互不兼容的同一外部依赖项版本。在这种情况下,您只需重新设计解决方案B或库A,使它们使用相同版本的mongocsharpdriver即可。

创建自己的软件包是一个我之前不知道的好选择。我相信这是在这里可以做的最好的事情。谢谢! - Iarek

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接