【发布时间】:2015-12-20 18:33:39
【问题描述】:
我开发了一个名为CompanyName.SDK 的函数库,它必须集成到公司项目CompanyName.SomeSolution中
CompanyName.SDK.dll 必须通过 NuGet 包部署。
CompanyName.SDK 包依赖于第 3 方 NuGet 包。举个很好的例子,让我们以Unity 为例。当前依赖于 v3.5.1405-prerelease 的 Unity。
CompanyName.SomeSolution.Project1 依赖于 Unity v2.1.505.2。
CompanyName.SomeSolution.Project2 依赖于 Unity v3.0.1304.1。
将CompanyName.SDK 集成到此解决方案中会增加对Unity v3.5.1405-prerelease 的依赖。
假设CompanyName.SomeSolution 有一个可运行的输出项目CompanyName.SomeSolution.Application,它依赖于上述两个和CompanyName.SDK
问题从这里开始。所有Unity 程序集在所有没有版本说明符的包中都具有相同的名称。在目标文件夹中,它将只有一个版本的Unity 程序集:v3.5.1405-prerelease 通过bindingRedirect 在app.config。
Project1、Project2 和 SDK 中的代码如何使用它们编码、编译和测试时所用的依赖包的完全需要的版本?
注意 1:Unity 只是一个例子,实际情况要糟糕 10 倍,因为 3rdparty 模块依赖于另一个 3rdparty 模块,而后者又同时具有 3-4 个版本。
注意 2: 我无法将所有软件包升级到最新版本,因为有些软件包依赖于其他软件包的非最新版本。
注意 3: 假设依赖包在版本之间有重大更改。这是我问这个问题的真正问题。
注意4:我知道about conflicts between different versions of the same dependent assembly 的问题,但那里的答案并不能解决问题的根源——他们只是隐藏它。
NOTE5: 承诺的“DLL Hell”问题解决方案到底在哪里?它只是从另一个位置重新出现。
注意6:如果您认为使用 GAC 是一种选择,请编写分步指南或给我一些链接。
【问题讨论】:
-
5) DLL 地狱的问题是您不能在 系统 上拥有同一个 DLL 的两个不同版本。这已经解决了。这并不意味着 DLL 的所有问题都已解决 :D 依赖关系仍然很棘手,而且它们总是很棘手,真的。版本是否向后兼容?如果是这种情况,您可以使用程序集绑定重定向。
-
@Luaan 见注 3。当它不使用 bindingRedirects 时,我必须要求其他开发人员更新他们项目中的旧包,但这不是解决方案。他们只是没有时间和预算。
-
NOTE2 是杀手。如果你不能解决这个问题,那么我只能建议将 Project1、Project2 和 SDK 部署到它们自己的运行时目录中,这样它们就可以拥有特定于版本的 3rd 方依赖项。
-
是的,破坏性更改总是一个问题。没有真正的解决方案——你有一个不兼容的依赖链。 是可以在同一个进程和同一个
AppDomain中加载同一个程序集的不同版本,但这是一个非常丑陋的hack,它会以微妙的方式中断。如果您可以将代码分成不同的进程或至少 AppDomain,这会变得容易得多 - 您只需要维护几个接口库。 -
想一想,为每个单独的统一版本添加一个代码库元素会起作用吗?像这样:stackoverflow.com/questions/638310/…
标签: c# .net nuget dependency-management