【问题标题】:Deploy a pyramid application with sdist使用 sdist 部署金字塔应用程序
【发布时间】:2013-06-26 18:57:58
【问题描述】:

我是金字塔框架的新手,最近开始使用它。但是,我对如何将使用“sdist”创建的 tarball 安装在生产虚拟环境中感到有些困惑。我的场景如下:

  1. 完成我在金字塔中创建的名为“myapp”的项目后,我运行:python setup.py sdist 以创建分发 tarball。
  2. 压缩包在“dist”文件夹下创建,其中包含我的所有项目源以及 .ini 文件(开发和生产)。
  3. 然后我通过执行以下命令创建一个新的生产虚拟环境:virtualenv --no-site-packages envprod
  4. 要安装“myapp”分发包,我执行:envprod/bin/easy_install src/myapp/dist/myapp0-0.tar.gz。
  5. 然后它开始下载并安装项目的所有要求,它还在 envprod/lib/python2.7/site-packages/myapp 下安装我的应用程序的源代码

问题是 development.ini 和 production.ini 都没有安装在新的 prod 环境中,所以我无法执行“pserve”,因为它需要 .ini 文件。

我做错了吗?或者有没有办法在没有 .ini 文件的情况下开始提供“myapp”?

谢谢!

【问题讨论】:

    标签: python pyramid


    【解决方案1】:

    首先你误解了什么是产品和配置。您的.ini 文件不属于您的应用程序。与 nginx 配置相同的方式不是 nginx 发行版的一部分。因此,通常您需要将产品代码与配置分开。根据您的喜好,您可以使用 virtualenv 或 buildout。我看到你已经使用了 virtualenv,但它只允许你安装 python Egg,如果你想要更多的自动化,那么你可以找到一组 buildout 用于金字塔的接收器,这可以使初始设置变得更容易。

    通常.ini 文件包含数据库连接字符串、端口或日志文件文件夹的路径。您可以为您的项目提供示例 .ini 文件,但您不需要将其存储在项目鸡蛋文件中(在您的示例中为 myapp0-0.tar.gz.)。

    第二部分是如何分发您的项目。您注意到大多数 python 项目都可以从 PyPI 下载(virtualenv 这样做)。如果您不想开源您的工作,那么您可以安装自己的 PyPI 服务器(只需 google 一下,有很多 examples)。然后,您将能够使用自己的自己的 PyPI 镜像在生产服务器上进行部署,而无需公开上传项目文件。 Upload with this command:

    $ python setup.py sdist upload
    

    并在您的服务器上安装字符串:

    (envprod)$ pip install -i http://my.mirr.or/path $PACKAGE
    

    最后一部分是如何为您的生产环境组织骨架。您可以使用.inirequirements.txt 文件示例、初始文件夹结构在 DCVS 中创建另一个项目,然后克隆到您的生产服务器。我更喜欢使用Makefiles 来进行初始工作,例如设置virtualenv、运行pip、下载静态jQuery(例如,如果你不使用CDN)。

    【讨论】:

    • 感谢您的详细解释米哈伊尔!现在说得通了。我将阅读社区创建的构建和食谱,因为我认为这可能是我需要的。
    • 只是想警告您,构建配置有时会令人困惑。并且不要在 virtualenv 中使用它;)
    • 啊,好的,太好了。谢谢你的提醒。欣赏它。
    【解决方案2】:

    正如 Mikhail 所说,代码和配置是相同的。 您可能希望多次部署您的包,而不是覆盖已安装的配置和数据。 请注意,如果数据库存在并且在文件系统 (sqlite) 上,它也不会分布在包内。我想这样做是为了让您轻松更新代码。

    如果您的意图是在生产环境中部署软件包,您只需复制要使用的 ini 和数据库(如果是 sqlite)或在之前运行 initilize_db 脚本(安装在 bin 中)启动应用程序。 请注意,在非生产环境中测试生产 ini 始终是一个好主意,以确保设置适合您,尤其是日志记录,因为您将没有控制台日志记录。

    虽然它对于开发/生产环境来说已经足够好了,但分发给第 3 方可能是个问题。 我只是想解决类似的问题,我认为重点是正确配置 setup.py 和 MANIFEST.in,将您需要的内容包含在 egg 中并在安装时正确提取它们。 问题似乎是 easy_install 跳过了您的应用程序文件夹之外的所有文件(所以 ini 文件,它们是一个目录)。

    解决方法是跳过 easy_install,解压缩 tarball,然后进入项目文件夹并使用: 点安装-e。 --pre (只有在项目中包含预发布包时才需要 --pre ,可能是因为它们是formalchemy的依赖项,就像我所做的那样)。 这似乎是分发给其他人的最简单方法。 无论如何,您可能希望以某种方式创建数据库以使其正常工作,除非您将其包含在分发中,明确将其添加到 MANIFEST 文件中。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-04-21
      • 2016-07-21
      • 2015-08-26
      • 1970-01-01
      • 1970-01-01
      • 2015-08-21
      • 2016-12-06
      • 1970-01-01
      相关资源
      最近更新 更多