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

时间:2015-10-14 21:47:02

标签: python pip dependency-management release-management nightly-build

情况

您正在开发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。由于每个依赖版本都是硬连线的,因此您可以控制稳定且一致的安装。通过手动将更新到较新版本,开发人员可以控制每晚构建/出血边缘依赖性:

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

自定义代码/工具(用例2)

如上所述,可以使用提供的API构建许多代码和自定义工具。每个愿意使用它的人都应该通过顶部的oneliner轻松安装/更新它。

问题

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

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

  • 为自定义用户维护自述文件,说明他们应该使用pip安装的稳定版本
  • 或在setup.py中为 Gui工具设置一些魔法克隆git repo并通过 python setup.py develop 使用它(版本控制可以然后由开发人员通过回购中的结账处理

但是,这些都不是特别优雅,所以我对你的解决方案,想法或最佳实践感兴趣,以便为Python提供稳定/流血/每晚构建依赖管理?

2 个答案:

答案 0 :(得分:1)

使用--pre flag of pip

可以在pip中管理“前沿”版本

来自pip install --help

  

- pre包括预发布和开发版本。默认情况下,pip只能找到稳定的版本。

您应该将classifiers添加到您的项目中,特别是将您的稳定版本设置为Development Status :: 5 - Production/Stable,将您的“前沿版本”设置为低于5的任何值。

这是主要的python包管理其alpha的方式,例如:django project,当前alpha为1.9a,稳定为1.8.5。

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

pip install --pre --upgrade library 

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

答案 1 :(得分:0)

我不确定您是否需要管理库或多个库?

您似乎遇到了复杂的Python依赖关系跟踪和部署案例。很少有大型Python项目面临同样的问题,需要跟踪几个不同的发布渠道,测试版和前沿。最值得注意的是Plone,其中包含超过300 MB的Python鸡蛋源代码。

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

要快速掌握这种情况,请参阅Plone核心构建

警告建筑物的边缘是神秘而粗糙的,就像刚浮出水面的火山熔岩岛一样。它是否比使用自定义脚本生成pip requirements.txt更优雅?如果您有多个需要管理的库,请单击是。