12

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

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

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

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

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

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

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

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

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

4

1 回答 1

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 处理)。

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

于 2013-09-02T12:36:42.363 回答