所以我有这个项目有许多从pip安装的依赖项,并记录在requirements.txt中 我现在需要添加另一个在pip上不存在的依赖项,我将它作为某个地址的RPM。 作为要求安装它的最Pythonic方法是什么? 谢谢! 代码将在RHEL和Fedora上运行
答案 0 :(得分:7)
在这种情况下,如果无法满足依赖性,Pythonic要做的就是失败。没关系,如果用户不满足安装的先决条件,您的用户将会感到有用的错误。考虑使用C库依赖项的众多Python包,以便正确构建和安装。在您的项目中,仍然在您的" setup.py"中声明所有Python依赖项。和" requirements.txt"文件,但Python打包工具链中没有任何东西可以为你安装RPM(也不应该!),所以如果没有安装RPM,就停在那里让安装失败。
除此之外,您可能需要考虑将Python应用程序本身打包为RPM。您有RPM依赖项,您的目标平台是Fedora / RHEL。通过将应用程序打包为RPM,您可以声明对其他RPM的依赖性,从而自动安装所需的软件包。担心在RPM的构建阶段成为Pythonic,并使用RPM魔法来完成剩下的工作。
我建议不要使用配置管理工具(Puppet,Ansible等),因为它们会使您的构建过程过于复杂。这些工具非常适合他们的预期用途,但这里就像使用大炮拍苍蝇一样。
答案 1 :(得分:5)
管理此类依赖关系的传统方法是使用配置管理系统,例如SaltStack - 我个人推荐它,因为它是用Python编写的,可以使用Python模块进行扩展。其他选择包括Puppet,Chef或Ansible。
使用配置管理系统,声明要在目标操作系统上安装和配置的软件包,配置文件和服务。然后,您运行代理并执行所有繁重的工作:复制文件,安装RPM软件包以及启用/禁用服务。优点是巨大的:您的操作系统配置被描述为代码,您始终可以获得可预测的结果并节省未来安装的时间。
请注意,使用CM引入了相当陡峭的学习曲线。但是,当你绕过它时,你永远不会再手动进行操作系统配置了。
更简单的方法是将必要的命令包装在bash脚本中,称为install_dependencies.sh
。一个应该作为应用程序部署的一部分运行此脚本,因此最好在某处记录该过程。
答案 2 :(得分:0)
由于我们正在讨论选项 - 我会投入一个尚未讨论过的选项。
Docker容器。
您可以使用所需的操作系统安装基本映像,然后Docker文件将安装您需要的所有依赖项。它也可以pip安装要求。
这可以使服务器保持其不需要的任何安装,并且版本控制很容易,因为您只需拥有一个带有新代码/依赖项的新容器,而不会与旧版本重叠。