引用从也使用其中一些包的项目中使用NuGet包的程序集

Iar*_*ica 5 .net c# assemblies .net-assembly nuget

我有一个复杂的库A,包含几个生成以下程序集的c#项目:

  • 核心
  • 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

在解决这些包的版本A,并B为他们没有同步发展不匹配.图书馆A是在一年前开发的,从那时起就一直使用.

问题:分发库的正确方法是什么,A以便:

  1. 即使A没有引用lib 依赖项,任何解决方案都可以使用它.
  2. 如果解决方案具有自己的lib A依赖项版本,则它们不会发生冲突.

我目前的做法:

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

那么,我该怎么办?处理冲突引用与引用引用的正确方法是什么?

Ric*_*ebb 7

管理共享引用的最佳方法是为库A 创建自己的NuGet包,其中包括库A依赖的任何依赖项(包括版本).如果您不想将库A发布到公共NuGet供稿,则可以托管自己的供稿.

NuGet有一些复杂的依赖项解析规则,它们将尝试查找与您的项目及其依赖项兼容的依赖项版本.不幸的是,这仍然无法解决您在上面第3点中的问题,其中您的解决方案及其依赖库使用相同外部依赖项的互不兼容的版本.在这种情况下,您只需重新使用解决方案B或库A,以便它们使用相同版本的mongocsharpdriver.