如何在setup.py中指定递归依赖项?

时间:2019-04-26 18:13:44

标签: python-3.x pip setuptools setup.py

我在使用pipsetuptools理解和实现Python打包的一些细节方面遇到困难。

假设我有三个项目,ABC,每个项目都是自己的程序包,并托管在自己的代码存储库中。它们也相互依赖,即AB导入,而BC导入。每个软件包都有一组 direct 依赖关系(即直接导入其他软件包)和一组 indirect 依赖关系(即由直接依赖软件包导入的软件包)。这些依赖关系是图形,而不是树。

对于软件包Asetup.py是否应仅包含直接依赖的软件包?软件包B是否相同?然后,当我pip install C时,我注意到安装了B,但没有安装A。我想这是因为AC的间接依赖项。

我真的不喜欢在每个软件包中存储pip freeze的想法(不灵活且冲突的织机),但是似乎pip不能递归地解决依赖关系图(请参阅{{3 }})。 here项目试图解决该问题,但现在已过时; snakebasket选项已弃用。

处理此问题的正确和推荐方法是什么?

附录我忘了提到 none ABC)这些软件包可通过dependency-links官方仓库,但位于私人Github仓库中。因此,例如B的setup.py包含

install_requires=(
    …,
    A==1.0.0,
    …,
    )

dependency_links=[                                                                                        
    f"https://{github_token}@github.com/repo/A/archive/v1.0.0.tar.gz#egg=A-1.0.0",
    ],

C包含程序包B的类似设置。

2 个答案:

答案 0 :(得分:0)

  

对于程序包A,setup.py是否应仅包含直接依赖的程序包?

是的。关注点分离:每个软件包都应列出其所需的依赖项。子程序包应该照顾自己。

  

然后pip install C时,我注意到安装了B,但没有安装。

可以举个例子吗?我有不同的经历。

  

看来pip不能递归地解决依赖关系图(请参见here)。

2015年的答案已过时。 pip installpip download递归地安装和下载依赖项。

答案 1 :(得分:0)

  

如何在setup.py中指定递归依赖项?

不要。

  

处理此问题的正确和推荐方法是什么?

setup.py应该在install_requires=[...]下列出 direct 依赖项。不要列出传递依赖项。并且不要在此处固定依赖项(尽管在某些情况下,您可能希望指定一个上限或下限,以确保收集到兼容的版本)。

  

然后pip install C时,我发现安装了B,但没有安装A

然后B未正确指定对A的依赖性。再次检查B的元数据。

确实是pip有时无法正确解析依赖关系树,并且自2013年以来就有open issue about that,但您不会在简单的C-> B中看到它->依赖图,仅在某些病理情况下。

检出我的项目johnnydep,以渲染dep树,并指出软件包元数据中缺少“分支”的位置。