8

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

  • 核心
  • A.缓存
  • A.记录
  • A.MongoDb

这个库是我写的,我可以完全访问它的源代码。它取决于几个 NuGet 包,假设它们是:

  • mongocsharpdriver
  • EnterpriseLibrary.缓存
  • EnterpriseLibrary.Logging

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

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

  • mongocsharpdriver
  • EnterpriseLibrary.Logging

这些软件包在解决方案中的版本AB匹配,因为它们不是同步开发的。图书馆A是在一年前开发的,从那时起就按原样使用。

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

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

我目前的做法:

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

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

4

1 回答 1

7

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

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

于 2012-09-18T12:32:38.003 回答