【问题标题】:Distributing a python package along with module dependencies using RPM使用 RPM 分发 python 包和模块依赖项
【发布时间】:2013-08-07 17:02:16
【问题描述】:

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

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

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

我查看了 virtualenv 的打包和分发,但似乎不太支持重新定位 virtualenv。

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

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

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

  1. 下载应用源码
  2. 运行脚本以获取特定模块依赖项(如果不存在)(可能使用pip
  3. 运行脚本构建python应用,并将它和所有下载的依赖打包到RPM中

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

【问题讨论】:

  • 您可能会分发一个独立的 python 可执行文件 - 打包在 RPM 中?您是否需要向用户提供源代码?如果不看这里stackoverflow.com/questions/5458048/…
  • 我没用过,但是conda's的目标是处理像你这样的案例。在此链接中查看“滚动您自己的包”部分。
  • 你应该使用 pip bundles 或 pip "wheel house"

标签: python virtualenv packaging rpm buildout


【解决方案1】:

我认为这是两个独立的问题。

  1. 您希望为您的开发人员提供一个可重复的安装/构建系统。

  2. 您需要安装程序生成器。

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

现在您有了一个可重复的构建,您可以将它用作安装程序的基础。 Handiest 是一个干净的虚拟机,仅用于此目的。例如,Virtualbox/vagrant。制作设置 virtualbox 并在其中安装适当依赖项的脚本。

然后,安装程序构建器脚本可以在 virtualbox 中重新检出您的项目,并在您希望在安装程序中包含它的位置(例如/opt/yourproject)执行可重复的构建。

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

如果你把你的大问题分解成这两个小问题,就可以分别攻击。

【讨论】:

  • FPM 的一个问题是,不同的包(您要安装的)可能有不同的依赖关系(例如,一个包需要请求 1.6,而另一个包需要请求 2.1 等)并且您无法表达这些差异,因为 FPM 会将单个 python 包打包为 RPM 并安装它(全局,可以这么说)。因此,最好将 python 项目及其依赖项安装为单个 RPM,例如 rpmvenv
猜你喜欢
  • 2012-03-20
  • 2013-09-15
  • 1970-01-01
  • 1970-01-01
  • 2020-01-03
  • 1970-01-01
  • 1970-01-01
  • 2021-05-01
  • 1970-01-01
相关资源
最近更新 更多