代码之家  ›  专栏  ›  技术社区  ›  Nick Presta

如何通过RPM分发python/django应用程序

  •  7
  • Nick Presta  · 技术社区  · 14 年前

    我已经读完了 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应用程序)的rpms,以便分别安装,以便升级不同的组件,最明智的方法是什么?

    我对创建源RPM不太了解,但我怀疑这是现成的信息。如果有什么特别好的资源可以用来创建源RPM,我也会感激它们的。

    如果重要的话,系统是esx 4 update 1。

    谢谢!

    更新: 在我看来,分发python-eggs甚至使用setup.py也是一个可行的内容分发解决方案。我也有兴趣听你这么说。

    5 回复  |  直到 8 年前
        1
  •  3
  •   tux21b    14 年前

    python包通常与 setuptools/distribute . 通常,您可以使用 easy_install <package_name> (可选特定版本号)。我建议您使用安装工具作为我们的主要分发方法,因为:

    • 它适用于所有平台
    • 通常是Python包的首选方法
    • .rpm或.deb安装脚本也可以重用其中的某些部分
    • 您可以在 virtualenv 在不需要根权限的情况下,服务器上安装的其他Web应用程序不存在冲突

    一个好的阅读资源是 Deploying with Distribute . 它专注于flask(另一个web框架),但简单地用“django”替换“flask”就可以了。

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

    本文可能会帮助您开始使用Fabric: Deploying with Fabric

    此外,我还建议您在 github bitbucket 对于希望手动获取最新源并使用 python setup.py install 之后。py安装脚本是我之前提到的distribute的一部分。

        2
  •  4
  •   Ignacio Vazquez-Abrams    14 年前

    最重要的是 正常的 打包python代码时遇到的问题,django项目有几个 其他 需要处理的问题:

    • 很好地利用系统路径
    • 很好地利用系统设施
    • 处理翻译
    • 随机化密钥

    我必须解决这些包装问题 Transifex ,我建议您调查已放置的各种位,以便使其工作:

    • 下安装 /usr/share/<projectname>
    • 使用 execfile() 从中加载设置 /etc/<projectname>
    • 巨大的翻译处理失控
    • 在安装后脚本中替换密钥
    • 所有其他需要的血腥变化和软糖
        3
  •  3
  •   Rob Hruska MegalomanINA    12 年前

    参照 chapter 5 of the Python documentation . 它将展示如何处理 布迪特 python实用程序。有了它,您将能够生成包括RPM在内的多种类型的包(或者它如何说“构建分发”)。

        4
  •  2
  •   Community holdenweb    7 年前

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

    还有一个关于在stackoverflow上从python创建RPM的注释 Creating Python RPM 也有一些细节。

    从经验来看,将python本身打包成一个RPM是最棘手的事情,所以利用已有的优势,我肯定会推荐一些东西。对于一些我已经看到这样做的程序,我们有一个makefile(是的,老派),在一个持续集成服务器上运行setup.py bdist_RPM命令,使RPM在构建后可用,并立即在CI服务器上可用。

        5
  •  2
  •   Jens Timmerman    8 年前

    I've written up a blog post on how to use setuptools and it's bdist_rpm 命令为您创建RPM。因此,确实要使用安装工具,但确实要以RPM的形式分发应用程序。 在安装工具中有一些捕获和奇怪的文档内容,您可以使用它们最终得到一个好的工作流。

    关键是您需要一个安装后脚本来运行迁移并收集静态文件,该脚本在安装了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
    

    通过在安装调用中提供此选项,您可以告诉安装工具在创建RPM之前将其添加到spec文件中:

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

    请参阅上面的链接,以获取完整的working 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