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

Python 使用sdist部署金字塔应用程序,python,pyramid,Python,Pyramid,我是金字塔框架的新手,最近开始使用它。然而,对于如何在生产虚拟环境中安装使用“sdist”创建的tarball,我有点困惑。我的设想如下: 在完成我在pyramid中创建的名为“myapp”的项目后,我运行:python setup.py sdist以创建分发tarball tarball是在“dist”文件夹下创建的,它包含我的所有项目源代码以及.ini文件(开发和生产) 然后,我通过执行:virtualenv--no-site-packages-envprod创建一个新的生产虚拟环境 要安装

我是金字塔框架的新手,最近开始使用它。然而,对于如何在生产虚拟环境中安装使用“sdist”创建的tarball,我有点困惑。我的设想如下:

  • 在完成我在pyramid中创建的名为“myapp”的项目后,我运行:python setup.py sdist以创建分发tarball
  • tarball是在“dist”文件夹下创建的,它包含我的所有项目源代码以及.ini文件(开发和生产)
  • 然后,我通过执行:virtualenv--no-site-packages-envprod创建一个新的生产虚拟环境
  • 要安装“myapp”分发tarball,我执行以下命令:envprod/bin/easy\u install src/myapp/dist/myapp0-0.tar.gz
  • 然后,它开始下载并安装项目的所有需求,并在envprod/lib/python2.7/site-packages/myapp下安装我的应用程序的源代码
  • 问题是development.ini和production.ini都没有安装在新的prod环境中,因此我无法执行“pserve”,因为它需要.ini文件

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


    谢谢

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

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

    第二部分是如何分发项目。您注意到大多数python项目都可以从PyPI下载(virtualenv可以这样做)。如果你不想开源你的作品,那么你可以安装自己的PyPI服务器(只需谷歌一下,就有很多)。这样,您就可以使用自己的PyPI镜像在生产服务器上部署,而无需公开上载项目文件

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

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

    最后一部分是如何组织生产环境的框架。您可以使用
    .ini
    requirements.txt
    文件示例、初始文件夹结构在DCV中创建另一个项目,只需克隆到生产服务器即可。我更喜欢使用
    Makefiles
    来完成初始工作,比如安装
    virtualenv
    ,运行
    pip
    ,下载静态jQuery(如果您不使用CDN的话)。

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

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

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

    一种解决方法是跳过easy_install,只需解开tarball,然后进入项目文件夹并使用: pip安装-e--之前 (只有在项目中包含预发布包的情况下,--pre才是必需的,可能是因为它们是形式化学的依赖项,就像我所做的那样)。 这似乎是我分发给其他人的最简单的方式。
    无论如何,您可能希望以某种方式创建数据库以使其正常工作,除非您将其包含在发行版中,并将其显式添加到清单文件。

    感谢您的详细解释!现在有道理了。我将阅读社区创建的构建和配方,因为我认为这可能是我所需要的。只是想提醒你,构建配置有时会令人困惑。不要在virtualenv中使用它;)啊,好的,太好了。谢谢你的警告。谢谢。
    (envprod)$ pip install -i http://my.mirr.or/path $PACKAGE