【问题标题】:How to distribute Python/Django App via RPM如何通过 RPM 分发 Python/Django 应用程序
【发布时间】:2010-07-12 04:35:54
【问题描述】:

我已经阅读了this question,我认为这是一个很好的开始,但我正在寻找更多的见解。

我使用 Python 2.6 和 Django 1.2.1 编写了一个应用程序。 我想在没有安装 Python 2.6 或 Django 的系统上部署这个应用程序。系统本身并没有安装很多东西 - sqlite3、pysqlite2、gcc 等。但是,系统确实有 Python 2.4.3。

创建 Python 2.6、Django 和我的应用程序本身(标准 Django 应用程序)的 RPM 以便可以单独安装以允许升级不同组件的最明智的方法是什么?

我对创建源 RPM 知之甚少,但我怀疑这是很容易获得的信息。如果有任何特别好的资源可用于创建源 RPM,我也将不胜感激。

系统是 ESX 4 Update 1,如果重要的话。

谢谢!

更新: 我也从未想过分发 Python Egg 甚至使用 setup.py 是一种可行的内容分发解决方案。我也有兴趣听听。

【问题讨论】:

    标签: python django rpm esx


    【解决方案1】:

    除了打包 Python 代码时遇到的所有正常问题之外,Django 项目还有一些其他问题需要处理:

    • 很好地使用系统路径
    • 使用系统设施玩得开心
    • 处理翻译
    • 随机化密钥

    我必须为打包 Transifex 解决这些问题,我建议您调查已到位的各种位以使其正常工作:

    • 安装在/usr/share/<projectname>
    • 使用execfile()/etc/<projectname> 加载设置
    • 巨大的翻译处理问题
    • 替换安装后脚本中的密钥
    • 需要的所有其他血腥变化和软糖

    【讨论】:

    • 我不会在系统路径下安装 Web 应用程序,因为您可能会遇到同时运行不同版本或冲突依赖项的问题。此外,应在配置期间而不是在安装期间对密钥进行随机化(想象集群中运行的多台服务器......)。
    • 如果您有一个集群,那么无论如何您都将使用诸如 puppet 之类的工具进行部署,因此无论如何它们最终都会使用相同的密钥。并且在系统路径下很好,因为您首先需要竭尽全力安装多个版本的软件包。
    【解决方案2】:

    Python 包通常与setuptools/distribute 一起分发。通常,您可以使用 easy_install <package_name> (可选地使用特定版本号)安装每个 python 包(及其依赖项)。我建议您使用 setuptools 作为我们的主要分发方法,因为:

    • 适用于所有平台
    • 通常是 Python 包的首选方式
    • .rpm 或 .deb 安装脚本也可以重用其中的一部分
    • 您可以在 virtualenv 中安装此软件包,无需 root 权限,与服务器上安装的其他 Web 应用程序无冲突

    Deploying with Distribute 是您阅读的好资源。它专注于 Flask(另一个 Web 框架),但只需将“Flask”替换为“Django”即可:)

    另一个非常适合分发和部署东西的 python 工具是fabric,除了分发之外,您还可以使用它(或者不使用它,但你想要)。例如,使用 Fabric,您可以一次在 N 个服务器上引导和安装您的应用程序(包括依赖项),管理多个开发、测试和生产服务器,并使用单个命令同时更新它们。

    这篇文章可能会帮助您开始使用 Fabric:Deploying with Fabric

    此外,我还建议您在 githubbitbucket 上发布您的存储库(或镜像现有的存储库),以便那些想要手动获取最新源并在之后使用 python setup.py install 安装您的应用程序的人。 setup.py 安装脚本是我之前提到的分发的一部分。

    【讨论】:

    • 它将如何运行我的 manage.py 运行服务器?我应该在哪里指定它?
    【解决方案3】:

    请参阅chapter 5 of the Python documentation。它将展示如何处理 bdist Python 实用程序。有了它,您将能够生成包括 RPM 在内的多种类型的包(或者,它所说的“内置发行版”)。

    【讨论】:

      【解决方案4】:

      已经有 python 2.6django 的 RPM 可用 - 所以这些至少(相对)容易通过 RPM 获取和安装。对于为您的项目创建 RPM,使用Distutils 编写了一些详细信息,其中详细介绍了您在规范文件中需要什么以及您调用什么来实现它。

      Creating Python RPM 上的 StackOverflow 上还有一条关于从 python 创建 RPM 的注释,其中也有一些细节。

      根据经验,将 python 本身打包为 RPM 是最棘手的小动物,因此我绝对推荐利用已有的东西。对于我见过的一些程序,我们有一个 Makefile(是的,老派)在持续集成服务器上运行 setup.py bdist_rpm 命令,使 RPM 作为构建的结果可用,并立即在CI服务器。

      【讨论】:

      • 问题是关于创建你自己开发的 django 应用程序的 rpm,而不是创建 django 的 rpm
      【解决方案5】:

      I've written up a blog post on how to use setuptools and it's bdist_rpm 命令为您创建 rpm。所以确实,使用 setuptools,但实际上,将您的应用程序作为 rpm 分发。 在 setuptools 中记录的内容下有一些问题和奇怪之处,您可以使用它们最终形成一个不错的工作流程。

      关键是您需要一个安装后脚本来运行迁移并收集静态文件,该脚本在安装 rpm 后运行

      export DJANGO_SETTINGS_MODULE=accountpage.settings
      mkdir -p /var/www/django/static && chown apache:apache /var/www/django/static
      runuser -m apache -c 'echo "yes" | django-admin collectstatic'
      django-admin migrate
      service httpd restart
      

      您可以告诉 setuptools 在创建 rpm 之前将其添加到规范文件中,方法是在 setup 调用中提供此选项:

      options = {'bdist_rpm':{'post_install' : 'bdist_rpm_post_install.sh'}},

      请参阅上面的链接以获取完整的 setup.py 脚本、安装后挂钩以及与 python setup.py test 一起使用的测试套件,它将在本地安装所有依赖项并运行 django 测试。

      要让 rpm 也自动安装它的依赖项,请创建一个 setup.cfg 文件,告诉 bdist_rpm 它的依赖项

      [bdist_rpm]
      requires = python >= 2.7
                 django >= 1.8
                 httpd
                 Django-Select2 >= 4.3.1
                 django-easy-select2
                 django-model-utils
                 pytz
                 django-oauth-toolkit
      

      【讨论】:

      • 博文链接已失效。
      猜你喜欢
      • 1970-01-01
      • 2012-05-26
      • 1970-01-01
      • 1970-01-01
      • 2017-08-01
      • 1970-01-01
      • 2017-07-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多