【问题标题】:Is there a way to bundle multiple packages together with Python setuptools?有没有办法将多个包与 Python setuptools 捆绑在一起?
【发布时间】:2012-07-29 09:28:37
【问题描述】:

我有包 A 和 B,它们都有自己的 git 存储库、PyPI 页面等。包 A 依赖于包 B,通过使用 install_requires 关键字,我可以让 A 自动下载并安装 B。

但假设我想为我特别不精通的用户更进一步;我实际上想在包 A 的 tar/zip 中包含包 B,因此无需下载(这也让他们有可能对包 B 的setup.cfg 进行任何手动编辑)

是否有建议的(理想情况下是自动化的)方法,

  • 当我为 A 调用 sdist 时,在 A 中包含 B
  • 告诉 setuptools B 与 A 捆绑在一起以解决依赖关系(类似于本地 dependency_links

谢谢!

【问题讨论】:

    标签: python setuptools


    【解决方案1】:

    这称为“供应商”,不,不支持这种方法。

    这也是个坏主意;您希望将安装留给专门的工具,这些工具不仅可以管理依赖关系,还可以管理安装的版本。使用buildoutpip's requirements.txt format 等工具,您可以非常精确地控制正在使用的版本。

    通过在内部捆绑依赖项的版本,您要么强制用户使用他们要使用的版本,要么使此类工具更难确保给定安装的使用版本一致。此外,您可能会浪费带宽和空间;如果其他软件包也包含相同的要求,您现在有多个副本。如果您的依赖项已更新以解决关键的安全问题,您必须重新发布任何捆绑它的包。

    过去,一些包确实使用 vendorize 打包将依赖项包含到其分发中。 requests 就是一个很好的例子;他们放弃了这种方法,因为它使他们的发布过程变得复杂。例如,每当其中一个供应商的软件包出现错误时,他们都必须生成一个新版本来包含修复。

    如果您确实想坚持包含软件包,则必须编写自己的支持。我相信requests 只是手动将供应商包添加到他们的存储库中;所以他们保留了一份不时更新的静态副本。或者,您可以在创建分发时扩展 setup.py 以下载代码。

    【讨论】:

    • 我同意这有点奇怪,但如果你放纵我一秒钟......我想要做的就是为 setuptools(或任何其他兼容的构建系统)的项目 B 提供一个“dependency_link”找到。我只是碰巧想把它放在项目 A 的 sdist 压缩包中。为什么这么糟糕?
    • @marius:为什么自动工具的第二次下载如此糟糕? :-)
    • 我想这主要是我放在括号中的内容,主要是我有点期待项目 B 可能需要对 setup.cfg 进行一些修改,对于我的非 Python 用户,我想要项目 B 的 @ 987654328@ 坐在那里准备修补,当 setuptools 尝试解决依赖关系时出现任何问题。
    猜你喜欢
    • 2020-08-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-16
    • 2019-06-07
    • 1970-01-01
    • 1970-01-01
    • 2010-12-20
    相关资源
    最近更新 更多