首页 文章

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

提问于
浏览
12

我有几个python应用程序由脚本/模块组成,应该打包并部署为RPM .

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

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

我已经看过包装和分发virtualenv,但重新定位virtualenv似乎并没有得到很好的支持 .

我看了zc.buildout,但发现文档缺乏 . 我可以看到如何在开发期间下载依赖项,但不知道如何将它们作为更大的应用程序的一部分进行分发 . 它's possible different apps require different versions of the same module, so these shouldn' t安装在系统范围内 .

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

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

  • 下载应用程序源码

  • 运行脚本以获取特定模块依赖项(如果不存在)(可能使用pip

  • 运行脚本来构建python应用程序,并将其和所有下载的依赖项打包到RPM中

然后,最终的RPM应该可以在没有网络访问权限的主机上安装和运行,并且只安装了python解释器 .

1 回答

  • 1

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

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

    • 您需要安装程序构建器 .

    Buildout(或pip,可能与额外的脚本结合使用)可以解决第一个问题 . 基本上:"how to get the project ready for development on a fresh laptop" . 理想情况下,你只需说 python bootstrap.py;bin/buildout 并做好准备(与pip / virtualenv相同) .

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

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

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

    如果你在这两个较小的问题中解决了你的大问题,那么两者都可能被单独攻击 .

相关问题