出血 Edge/Nightly 在 Python 中构建依赖管理。策略和最佳实践?

Bleeding Edge/Nightly Build dependency management in Python. Strategies and best practices?


情况


您有 2 个软件产品正在开发中,一个 提供 API 和一个 GUI 工具 公开最终用户的图书馆。 此外,您希望您所在位置的很多技术人员将库用作各种相关自定义代码、工具和资产的构建块。

两种软件产品(库和 GUI 工具) 都在积极开发中并相互影响。对于您想要最简单的分发方式和 devenv 设置,使用 pip:

pip install gui_tool
or
pip install library

Gui 工具(用例 1)


GUI 工具的安装是通过 pip 进行的,依赖项在 setup.py.您的库是这些依赖项之一:

...
install_requires = ['library==1.2, package_x==0.3, package_y==0.6'],
...

安装过程包括安装工具和将依赖项解析到新的 virtualenv 中。因为每个依赖版本都是硬连线的,所以您可以控制稳定一致的安装。开发人员可以通过手动将 更新到较新版本来控制每晚 builds/bleeding 边缘依赖性:

pip install --upgrade library  # get the latest nightly build/hotfix release on your own

自定义 code/tools(用例 2)


如前所述,许多代码和自定义工具可能会使用您的 提供的 API 构建。每个愿意使用它的人都应该 install/update 使用顶部的 oneliner 轻松地通过 pip 使用它。


问题


其他 GUI 工具 开发人员应该能够使用 pip 在夜间 builds/hotfix 发布 library 依赖项。其他工作人员在某处使用 library 作为构建块,应该始终使用 pip 获取最新的稳定版本。您希望为 保留一个独特的发布程序,通过 X.Y.Z 版本控制提供稳定版本、前沿和修补程序版本。

对此有一些可能的解决方案,例如:


然而,其中 none 看起来特别优雅,所以我对 stable/bleeding edge/nightly 构建依赖管理 Python 的解决方案、想法或最佳实践很感兴趣?

我不确定你是需要管理图书馆还是几个图书馆?

您似乎有一个复杂的 Python 依赖跟踪和部署案例。很少有大型 Python 项目面临同样的问题,即需要跟踪多个不同的发布渠道、测试版和前沿技术。其中最著名的是 Plone,其中包含超过 300 MB 的 Python egg 源代码。

Plone 使用 buildout 作为依赖管理器而不是 pip 来解决复杂性。 Buildout 为 Python 依赖项提供混合和匹配配置文件。

要快速了解这是如何发生的,请参阅 Plone 核心构建

警告 Buildout 的边缘神秘而粗糙,就像刚刚浮出水面的热熔岩火山岛。是不是比用自定义脚本生成 pip requirements.txt 更优雅?是的,如果您有多个图书馆需要管理。

管理 pip 中的 "bleeding edge" 版本可以通过使用 --pre flag of pip

来实现

来自pip install --help

--pre Include pre-release and development versions. By default, pip only finds stable versions.

您应该将 classifiers 添加到您的项目中,特别是将您的稳定版本设置为 Development Status :: 5 - Production/Stable 并将您的 "bleeding edge releases" 设置为低于 5.

这就是主要的 python 软件包管理其 alpha 的方式,例如:django project 当前 1.9a 处于 alpha 状态,1.8.5 处于稳定状态。

要升级到标记为 Development Status :: 3 - Alpha 的最新版本:

pip install --pre --upgrade library 

使用该库作为构建块的用户现在不需要关于 alpha 版本的信息,而是会使用常规 pip install library,它将安装最新的稳定标记版本。