2015-02-11 60 views
3

我有两个python包AB,我想合并成A,即B的所有功能现在可以在A.B中获得。以前,A-1.0依赖于B-1.0。现在我想避免,A-2.0的用户仍然安装B-1.0,我不知道如何正确处理这个问题。Python的依赖关系:将两个包合并为一个

不同的解决方案/想法,我想出了:

  • 包括在A-2.0试图一些代码导入B,如果一个ImportError提高,捕获异常并继续下去,否则抛出抛出一个RuntimeError是B被安装在平行

  • 不知何故标记B作为A-2.0阻断剂(这可能?)

  • B创建一个“假”后继者,因此更新其虚拟环境或安装B“最新”版本的用户将获得一个空包,导入时会引发异常。

我欢迎您的意见和经验

+0

我喜欢选项3. – Kevin 2015-02-11 14:30:39

+1

“我想合并到A中的A和B” - 您绕过了可以正确处理依赖关系的包管理器,为自己创建了一个问题。您应该有一个令人信服的理由来合并它们,或者根本不合并它们。 – msw 2015-02-11 14:58:36

+0

如果你制作了一张(A.version,B.version,is_allowed?)表格,这个问题会更加清楚。 – msw 2015-02-11 15:01:56

回答

1

我认为,你不能! (至少不使用这种技巧,正如你所描述的那样)。

Python包系统(据我所知)没有“允许”包这样的概念。可能有一个人发明了一个不同的包C,他称之为B,但功能完全不同。这样的概念会禁止你的软件包A的用户使用软件包C(别名B)。

因此,我会与A的用户沟通,B不再需要,并确保您的新编码根本不引用B.当有人安装B时,它就像是一个与你无关的第三方库。

当然,当A和B的功能非常混杂,其他用户代码也必须直接处理B并且对A有副作用时,如果旧B是仍然安装。但是,最初的设计也不是最好的。在这种情况下(当你真的需要合并软件包 - 见下文),我会建议你制作一个全新的软件包名称,比如“newA”来强调事实,某些东西已经根本改变了(因此旧A和B之间的混合也更可能被检测到)。

但当然,我会第二个msw的论点,你自己创建你的问题。通常情况下,拥有更小的包装(当然,如果它们的尺寸合理)而不是更大的“我管理世界”包装会更好。您可以将不同的应用更好地结合使用更小的封装。