我在使用 pip
理解和实现 Python 打包的一些细节时遇到困难和 setuptools
.
假设我有三个项目,A
和 B
以及 C
,每个项目都是自己的包并托管在自己的代码库中。它们也相互依赖,即 A
由 B
导入,B
由 C
导入。每个包都有一组直接依赖项(即直接导入其他包)和一组间接依赖项(即由直接依赖包导入的包)。这些依赖关系是一个图,而不是树。
对于包 A
,应该 setup.py只包含直接依赖的包?包 B
也一样吗?然后,当我 pip install C
时,我注意到安装了 B
,但没有安装 A
。我想那是因为 A
是 C
的间接依赖项。
我不太喜欢存储 pip freeze
的想法在每个包中(不灵活且冲突织机),但似乎 pip
没有递归地解析依赖关系图(参见 here )。 snakebasket
项目试图解决这个问题,但现在已经过时了; dependency-links选项已被弃用。
处理此问题的正确和推荐方法是什么?
附录 我忘了提到没有的包(A
、B
、C
) 可通过官方 PyPi 获得 repo ,但住在私有(private) Github repo 。因此,例如 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
设置。
最佳答案
How to specify recursive dependencies in
setup.py
?
不要。
What is the proper and recommended way of handling this?
setup.py
应在 install_requires=[...]
下列出直接 依赖项。不要列出传递依赖项。并且不要在此处固定依赖项(尽管在某些情况下,您可能希望指定上限或下限以确保收集到兼容版本)。
When I then
pip install C
I noticed thatB
gets installed, but notA
.
然后 B
没有正确指定对 A
的依赖。再次检查 B
的元数据。
pip 有时无法正确解析依赖树,是是真的,并且有一个 open issue about that自 2013 年以来,但您不会在简单的 C -> B -> 依赖图中看到它,只会在一些更病态的情况下看到它。
查看我的项目 johnnydep
呈现 dep 树并指示您在包元数据中缺少“分支”的位置。
关于python-3.x - 如何在 setup.py 中指定递归依赖?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55872992/