【问题标题】:Referencing assemblies that use NuGet packages from a project that also uses some of these packages从也使用其中一些包的项目中引用使用 NuGet 包的程序集
【发布时间】:2023-03-26 15:16:01
【问题描述】:

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

  • A.Core
  • A.缓存
  • A.记录
  • 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. 即使未引用 lib A 依赖项,任何解决方案都可以使用它。
  2. 如果解决方案有自己版本的 lib A 依赖项,它们不会冲突。

我目前的做法:

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

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

【问题讨论】:

    标签: c# .net assemblies nuget .net-assembly


    【解决方案1】:

    管理共享引用的最佳方式是为库 A 提供 create your own NuGet package,其中定义了库 A 所依赖的任何依赖项(包括版本)。如果不想将库 A 发布到公共 NuGet 提要,可以host your own feed。

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

    【讨论】:

    • 创建我自己的包是我不知道的一个很好的选择。我相信这是可以在这里做的最好的事情。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-22
    • 2016-06-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多