如何解决DotNet Core中的NuGet依赖地狱?

7
我正在开发一个asp.net core解决方案,其中有几个不同的项目,每个项目都使用特定版本的第三方NuGet包。这些版本(例如1.0.0和2.0.0)有着不兼容的变化。此外,该库由另一个项目团队开发,我无法对其进行影响。
因此,在未来可能会出现不兼容的版本,而我的限制是在特定项目中使用一个确切的版本。
以下是解决方案的最小概述:
- MySolution - WebApp - Project1 - CustomLibrary(v1.0.0) - Project2 - CustomLibrary(v2.0.0)
在Visual Studio中开发时,我可以在每个项目中使用我的版本库的各个方法,一切正常。如果我最终发布应用程序,则输出文件夹中只有一个v2.0.0的CustomLibrary.dll。
我对此有些困惑。这个dll是否包含两个版本,并且dotnet能够在运行时解决它们? 如果不是这样,应用程序将在运行时失败,因为v1.0.0的方法和输出可能与v2.0.0完全不同。
(在.Net Framework中,我可以做到this,但似乎在.Net Core中不适用)
有没有部署相同强名称库的不同版本的解决方案? 我想应该可以部署特定版本的NuGet包?
如果您能帮忙解答,我将不胜感激。

2
如果我是你,我会升级project1的依赖项以匹配project2的版本,然后在两个项目中都使用一个依赖项。这需要一些努力和时间,但这是一次性的工作,将使未来的事情更加顺利。因为在未来维护相同依赖项的不同版本将会很麻烦,而且你可能最终会将它们都升级到最新版本或更糟糕的是,将它们转换为不同的依赖项! - iSR5
如果您绝对不想更新您的解决方案,并且NuGet包是一个具有MIT许可证的开源项目,那么我建议您从旧版本克隆存储库,并使用不同的名称重新打包它。 - Bizhan
外部库是由另一个项目团队开发的,无法影响。因此,即使在未来,也会有不兼容的版本,并且我必须在特定项目中使用一个确切的版本。 - BurghardH
@Bizhan 这个问题涉及到dotnet core,因为.NET Framework以另一种方式处理这个问题。 - BurghardH
在发布文件夹中,您只会有一个更高版本。 - Mani
1个回答

0

有一些.NET Core的架构限制会影响应用程序设计:

  1. 不能将同一程序集的不同版本同时加载到单个.NET Core进程中。这个限制会防止您的应用程序同时使用两个项目。
  2. 没有发布过程可以自动将两个版本的程序集合并成一个通用程序集。

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

在这种情况下,如果您的应用程序需要在其生命周期内与Project1和Project2一起工作,则可能需要使用可收集的AssemblyLoadContext。场景是,Project1和Project2都能够使用可收集的AssemblyLoadContext进行加载和卸载,并且应用程序可以根据需要在它们之间切换。

希望这能帮助解决问题。


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