【发布时间】:2013-04-01 23:16:12
【问题描述】:
假设 2 年前,我编写了一个 .NET 类库,比如 mylib.dll,它在很大程度上依赖于一个外部库,比如 foo.dll,它是开源的、MIT 许可的(这是相关的,请继续阅读) .
很多客户使用我的库以及它的依赖程序集。包是mylib.dll 和foo.dll。
几天过去了,foo.dll 的创建者破坏了他们的 API,现在他们部署了一个新版本的库。这个新版本包含了旧版本中包含的大部分类型,但其中一些方法丢失或更改了。
问题
一些潜在的消费者已经在他们的应用程序中使用foo.dll 的新版本,供他们自己使用。当我向他们提供mylib.dll 时,他们无法使用它。他们甚至无法成功构建,因为mylib.dll 想要旧版本的foo.dll 及其旧方法和签名。
如何解决这个问题?
我想要一个前向兼容的解决方案,这样这个问题就不会再次出现。于是我想到了几件事:
- 更新我的源代码以使用新版本的
foo.dll。但这需要大量的工作和时间。此外,这不是向前兼容的,因为这个问题可能会在某一天再次出现。 - 既然我有
foo.dll的确切版本的来源,也许我可以轻松地更改它的命名空间并重建整个东西。这样我就可以享受我自己的foo.dll版本,这是合法的,因为它的许可证是 MIT。我可以将修改后的程序集命名为mylib.foo.dll或类似名称。我什至可以使用ILMerge将整个内容合并到mylib.merged.dll之类的内容中。 - 重新设计
mylib.dll,以便将foo.dll所需的功能分离为接口和实现。在工程方面,这是最优雅的解决方案。就时间而言,这是一场灾难,因此不能被视为真正的解决方案。
我的问题
要完成上面的#2,有没有一种捷径可以改变给定源代码的命名空间?
【问题讨论】:
-
为什么不使用简单的查找-替换操作呢?您只需要将
foo的所有文件中的namespace foo替换为namespace mylib.foo。然后您必须将using foo替换为using mylib.foo。完成。 -
@RB,我认为您在这里忽略了重点,或者我不明白您的建议。您是否建议新消费者使用旧版本的
foo.dll?如果是这样,那么从我公司的角度来看,这不是一个明智的商业决策。 -
@RonKlein 但是您在选项 2 中的建议肯定是您将分叉
foo.dll,因此您的客户无论如何都会拥有它的旧版本(我想您不太可能维护它与原始作者的程度相同-我知道我不会!)。还是我完全误解了? -
(续)如果不创建自己的
foo分支,客户应用程序的文件夹中需要有两个不同版本的foo.dll,这显然是不可能的。 -
@RB.:您错过了客户应用程序 和
mylib不使用 GAC,因此他们都希望foo.dll位于应用程序文件夹中.但他们需要不同的版本。这与.NET 无关。这只是因为文件系统只关心文件的名称,而不关心文件的版本。
标签: .net dependencies versioning forward-compatibility