【问题标题】:How to solve nuget dependency hell in dotnet core?如何解决dotnet核心中的nuget依赖地狱?
【发布时间】:2019-12-06 11:04:45
【问题描述】:

我正在开发一个包含几个不同项目的 asp.net 核心解决方案,每个项目都使用某个版本库的第 3 方 NuGet 包。这些版本,例如1.0.0 和 2.0.0 有重大变化。另外,这个库是由另一个项目组开发的,不受我的影响。 因此,将来会有与另一个不兼容的版本,我的限制是在特定项目中使用一个确切的版本。

以下是解决方案的简要概述:

  • 我的解决方案
    • Web 应用程序
    • 项目1
      • 自定义库 (v1.0.0)
    • 项目2
      • 自定义库 (v2.0.0)

在 Visual Studio 中进行开发期间,一切都很好,我可以在每个项目中使用我的版本库的各个方法。如果我最终发布了我的应用程序,输出文件夹中只有一个 CustomLibrary.dll 版本为 v2.0.0。

我对此有点困惑。这个 dll 是否同时包含两个版本,并且 dotnet 可以在运行时解析它们吗? 如果不是这种情况,应用程序将在运行时失败,因为 v1.0.0 的方法和输出可能与 v2.0.0 完全不同。

(在 .Net 框架中我可以做 this,但它似乎不适用于 .Net Core)

是否有部署同一强名称库的不同版本的解决方案? 我想应该可以部署特定版本的 NuGet 包?

如果您能帮助我,我将不胜感激。

【问题讨论】:

  • 如果我是你,我将升级 project1 依赖项以匹配 project2 版本,然后在两者上使用一个依赖项。这需要一些努力和时间,但这是一次性的工作,这将使未来的事情变得更加顺利。由于维护相同依赖项的不同版本将来会很麻烦,而且您最终可能会将它们都升级到最新版本或更糟,将它们转换为不同的依赖项!。
  • 如果您绝对不想更新您的解决方案,并且 nuget 包是具有 MIT 许可证的开源项目,那么我建议您从旧版本中克隆 repo 并使用不同的名字。
  • 外部库是其他项目组开发的,不能影响。因此,即使在未来,也会有与另一个版本不兼容的版本,并且我有限制在特定项目中使用一个确切的版本。
  • @Bizhan 这个问题与 dotnet core 有关,因为 .NET Framework 以另一种方式处理这个问题。
  • 在 Publish 文件夹中,您将只有更高版本。

标签: c# .net-core deployment nuget


【解决方案1】:

有几个 .NET Core 架构限制会影响应用程序设计:

  1. 不能同时将同一程序集的不同版本加载到单个 .NET Core 进程中。此限制将阻止您的应用同时使用这两个项目。
  2. 没有任何发布过程可以神奇地将程序集的两个版本组合成一个通用程序集。

记住这一点,您需要重新设计您的应用并在运行时动态加载带有 CustomLibrary v1.0.0 的 Project1。 Project2 也是如此。您应该最终得到一个新架构,其中 Project1 和 Project2 将发布到不同的文件系统位置并在运行时动态加载。

在这种情况下,您的应用程序需要在其生命周期内同时与 Project1 和 Project2 一起工作,如果您的程序集可以与可收藏的 AssemblyLoadContext 很好地配合使用,这是可能的。该场景是 Project1 和 Project2 都能够通过可收集的 AssemblyLoadContext 加载和卸载,并且应用程序将根据需要在它们之间切换。

希望这将有助于解决问题。

【讨论】:

    猜你喜欢
    • 2015-12-20
    • 2021-09-14
    • 2015-12-21
    • 1970-01-01
    • 2019-03-12
    • 1970-01-01
    • 2017-07-20
    • 2017-11-21
    • 2021-07-16
    相关资源
    最近更新 更多