有没有办法将多个包与 Python setuptools 捆绑在一起?

mar*_*ius 5 python setuptools

我有A包和B包,都有自己的git仓库,PyPI页面等等……A包依赖B包,通过install_requires关键字我可以让A自动下载安装B。

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

是否有建议的(最好是自动化的)方法,

  • 当我呼叫 A 时,将 B 包含在sdistA 中
  • 告诉 setuptools B 与 A 捆绑在一起以解决依赖关系(类似于 local dependency_links

谢谢!

Mar*_*ers 1

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

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

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

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

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