使用sdist部署金字塔应用程序

时间:2013-06-28 21:53:53

标签: python pyramid

我是金字塔框架的新手,我最近开始玩它。但是,我对在生产虚拟环境中如何安装使用'sdist'创建的tarball感到困惑。我的方案如下:

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

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

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

    谢谢!

2 个答案:

答案 0 :(得分:2)

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

通常.ini个文件包含数据库连接字符串,端口或日志文件路径文件夹。您可以为项目提供示例.ini文件,但不需要将其存储在项目egg文件中(在示例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执行初始工作,例如setup virtualenv,运行pip,下载静态jQuery(例如,如果您不使用CDN)。

答案 1 :(得分:0)

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

如果您打算在生产环境中部署软件包,那么您需要做的就是复制要使用的ini和数据库(如果是sqlite),或者运行initilize_db脚本(安装在bin中)启动应用程序。 请注意,在非生产环境中测试生产ini始终是一个好主意,以确保设置对您有利,特别是有关日志记录,因为您将没有控制台日志记录。

虽然它对dev / prod环境来说足够好,但是向第三方分发可能是一个问题。 我只是想解决类似的问题,我认为重点是正确配置setup.py和MANIFEST.in,在鸡蛋中包含你需要的东西,并在安装时正确提取它们。 问题似乎是easy_install跳过app文件夹之外的所有文件(所以ini文件,这是一个目录)。

解决方法是跳过easy_install,然后解开你的tarball,然后输入你的项目文件夹并使用:   pip install -e。 - 事先 (只有在你的项目中包含预发布包时才需要--pre,也许是因为它们是正式的依赖,正如我所做的那样)。 这似乎是向其他人分发的最简单方法。 无论如何,您可能想以某种方式创建数据库,以使其工作,除非您将其包含在分发中明确地将其添加到MANIFEST文件中。