使用RPM分发python包以及模块依赖项

时间:2013-08-07 17:02:17

标签: python virtualenv packaging rpm buildout

我有几个python应用程序,包含脚本/模块,应该打包并部署为RPM。

更棘手的是每个应用程序应该与所有python模块依赖项一起分发,并且这些应该优先于系统安装的任何应用程序使用。

某些RPM的目标主机具有有限的网络访问权限,因此RPM应包含运行应用程序所需的所有内容,而不是在部署时下载任何内容。

我看过打包和分发virtualenv,但是重新定位virtualenv似乎并没有得到很好的支持。

我看过zc.buildout,但发现文档缺乏。我可以看到如何在开发期间下载依赖项,而不是如何将它们作为更大的应用程序的一部分进行分发。不同的应用程序可能需要同一模块的不同版本,因此不应在系统范围内安装这些版本。

另一个痛点是应用程序中的任何python脚本都需要修改为在开发期间和部署后使用不同的sys.path,我无法看到明显的方法。

关于如何最好地实现这一点的建议?从开发人员的角度来看,工作流程的理想总结如下所示:

  1. 下载应用程序源
  2. 运行脚本以获取特定模块依赖项(如果不存在)(可能使用pip
  3. 运行脚本来构建python应用程序,并将其打包并将所有下载的依赖项打包到RPM
  4. 然后,最终的RPM应该可以在没有网络访问权限的主机上安装和运行,并且只安装了python解释器。

1 个答案:

答案 0 :(得分:1)

我认为这是两个不同的问题。

  1. 您需要为开发人员提供可重复的安装/构建系统。

  2. 您需要安装程序构建器。

  3. Buildout(或pip,可能与额外的脚本结合使用)可以解决第一个问题。基本上:“如何让项目为新笔记本电脑的开发做好准备”。理想情况下,您只需说python bootstrap.py;bin/buildout并做好准备(与pip / virtualenv相同)。

    现在您拥有可重复的构建,您可以将其用作安装程序的基础。最简单的是一个干净的虚拟机,您只是为此目的使用它。例如,Virtualbox / vagrant。制作设置虚拟盒的脚本,并在那里安装适当的依赖项。

    然后,安装程序构建器脚本可以在虚拟机内对项目进行全新检查,并在要在安装程序中安装它的位置执行可重复构建(例如/opt/yourproject)。 p>

    然后使用FPM制作实际的包(.deb,.rpm,等等)。通过FPM选项告诉它必要的依赖关系,这样你就可以始终确保安装了这些依赖项。 (注意:这些是OS级依赖,如memcached或postgres; python依赖应该由pip或buildout处理。)

    如果你在这两个较小的问题中解决了大问题,两者都可以单独攻击。