【问题标题】:How to specify recursive dependencies in setup.py?如何在 setup.py 中指定递归依赖项?
【发布时间】:2019-04-26 18:13:44
【问题描述】:

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

假设我有三个项目,ABC 每个项目都是自己的包并托管在自己的代码仓库中。它们也相互依赖,即AB导入,BC导入。每个包都有一组直接依赖(即直接导入其他包)和一组间接依赖(即直接依赖包导入的包)。这些依赖关系是一张图,而不是一棵树。

对于包Asetup.py 是否应该只包含直接依赖的包?包B也一样?然后当我pip install C 时,我注意到安装了B,但没有安装A。我想这是因为AC 的间接依赖。

我不太喜欢在每个包中存储一个pip freeze 的想法(不灵活且冲突隐约可见),但似乎pip 不会递归地解析依赖关系图(请参阅here)。 snakebasket 项目试图解决这个问题,但现在已经过时了; dependency-links 选项已被弃用。

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

附录我忘了提没有包(ABC)可通过官方PyPi repo 获得,但住在私人 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 的设置。

【问题讨论】:

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


    【解决方案1】:

    如何在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 树并指出您在包元数据中缺少“分支”的位置。

    【讨论】:

    • 我很抱歉,我应该提到这些包存在于一个私人仓库中。另请参阅上面的 附录 ?
    • 是的,这是需要包含的重要信息! dependency_links 已被弃用一段时间。最好的方法是将包托管到包索引 - 不一定是 PyPI,它可以是私有索引 - 而不是试图直接依赖于 github(它不满足 Simple Repository API 并且因此不适用于 pip )。
    • 谢谢!你能推荐这样一个私人索引还是我必须自己托管一个? this article 还有效吗?
    • 是的,该文章仍然有效。我建议使用devpi-server
    • 不,这是不可能的。 用户 必须选择使用非标准索引,而不是包。如果您可以放入 setup.py 元数据以从某个随机网站而不是从 PyPI 获取依赖项,那么黑客将太容易分发恶意代码。
    【解决方案2】:

    对于包 A,setup.py 是否应该只包含直接依赖的包?

    是的。关注点分离:每个包都应该列出它需要的依赖项。子包应该照顾自己。

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

    你能举个例子吗?我有不同的体验。

    似乎 pip 没有递归解析依赖图(参见here)。

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

    【讨论】:

    • 我很抱歉,我应该提到这些包存在于一个私人仓库中。另请参阅上面的 附录 ?
    猜你喜欢
    • 1970-01-01
    • 2012-05-21
    • 2017-12-02
    • 2018-09-17
    • 2013-03-27
    • 2014-03-24
    • 2013-07-17
    • 2016-01-05
    • 2017-12-09
    相关资源
    最近更新 更多