我在使用pip
和setuptools
理解和实现Python打包的一些细节方面遇到困难。
假设我有三个项目,A
,B
和C
,每个项目都是自己的程序包,并托管在自己的代码存储库中。它们也相互依赖,即A
由B
导入,而B
由C
导入。每个软件包都有一组 direct 依赖关系(即直接导入其他软件包)和一组 indirect 依赖关系(即由直接依赖软件包导入的软件包)。这些依赖关系是图形,而不是树。
对于软件包A
,setup.py是否应仅包含直接依赖的软件包?软件包B
是否相同?然后,当我pip install C
时,我注意到安装了B
,但没有安装A
。我想这是因为A
是C
的间接依赖项。
我真的不喜欢在每个软件包中存储pip freeze
的想法(不灵活且冲突的织机),但是似乎pip
不能递归地解决依赖关系图(请参阅{{3 }})。 here项目试图解决该问题,但现在已过时; snakebasket
选项已弃用。
处理此问题的正确和推荐方法是什么?
附录我忘了提到 none (A
,B
,C
)这些软件包可通过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
的类似设置。
答案 0 :(得分:0)
对于程序包A,
setup.py
是否应仅包含直接依赖的程序包?
是的。关注点分离:每个软件包都应列出其所需的依赖项。子程序包应该照顾自己。
然后
pip install C
时,我注意到安装了B,但没有安装。
可以举个例子吗?我有不同的经历。
看来pip不能递归地解决依赖关系图(请参见here)。
2015年的答案已过时。 pip install
和pip 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树,并指出软件包元数据中缺少“分支”的位置。