Django和VIRTUALENV开发/部署的最佳实践

问题描述:

只是好奇人们是如何使用的virtualenvDjango和VIRTUALENV开发/部署的最佳实践

  • 更具体部署结合自己的Django项目,你如何保持你的开发机正确同步的你生产的virtualenv的?

我使用git for scm,但是我没有在git repo中使用virtualenv - 我应该使用pip冻结还是使用冻结输出在服务器上重新创建环境? (如果你这样做,请你描述的步骤 - 我发现在解冻过程中很少好的文档 - 有点像pip install -r freeze_output.txt可能吗?)

我只是在使用pip,Fabric和git来设置类似的东西。流程基本上是这样的,并从中大量借用this script

  1. 在我们的源代码树中,我们维护一个requirements.txt文件。我们将手动维护。
  2. 当我们做一个新版本时,Fabric脚本根据我们传递它的任何树形创建一个存档。
  3. Fabric将找到我们正在部署的内容的SHA,使用git log -1 --format=format:%h TREEISH。这给了我们SHA_OF_THE_RELEASE
  4. Fabric将得到我们需求文件的最后一个SHA,其中git log -1 --format=format:%h SHA_OF_THE_RELEASE requirements.txt。这就产生了散列的短版本,比如1d02afc,它是这个特定版本的文件的SHA。
  5. Fabric脚本将查看我们的virtualenvs存储在远程主机上的目录。
    1. 如果没有一个名为1d02afc目录,新的virtualenv创建和设置与pip install -E /path/to/venv/1d02afc -r /path/to/requirements.txt
    2. 如果有现有path/to/venv/1d02afc,什么都不做

的小魔术其中一部分是传递任何你想要的东西,然后让它做包装(来自Fabric)。通过使用git archive my-branch,git archive 1d02afc或其他任何东西,我保证会在我的远程机器上安装正确的软件包。

我走了这条路线,因为如果软件包在发行版之间没有改变,我真的不想有额外的virtuenvs浮动。我也不喜欢在自己的源代码树中拥有我所依赖的实际软件包的想法。

+0

链接被破坏+( – 2013-01-08 16:03:50

我用这个bootstrap.py:http://github.com/ccnmtl/ccnmtldjango/blob/master/ccnmtldjango/template/bootstrap.py

其预计被称为'要求'的目录看起来像这样:http://github.com/ccnmtl/ccnmtldjango/tree/master/ccnmtldjango/template/requirements/

有一个apps.txt,一个libs.txt(其中apps.txt包括 - 我只是想保持Django的应用程序与其他python模块分开)和一个包含实际tarball的src目录。

当运行./bootstrap.py时,它会创建virtualenv(如果它存在,则擦除前一个),然后将requirements/apps.txt中的所有内容安装到它中。否则,我不会将任何东西安装到virtualenv中。如果我想包含一个新的库,我将tarball放入requirements/src /中,在其中一个文本文件中添加一行并重新运行./bootstrap.py。

bootstrap.py和需求被检入版本控制(也是pip.py的一个副本,所以我甚至不必在任何地方安装系统)。 virtualenv本身不是。我推送到生产环境的脚本在每次推送时都会在生产服务器上运行./bootstrap.py。 (bootstrap.py也需要一定的时间来确保它坚持Python 2.5,因为这就是我们在生产服务器上所拥有的(Ubuntu Hardy),而我的开发机器(Ubuntu Karmic)默认为Python 2.6,如果你不小心的话)

+1

此答案中的链接已损坏。请你能纠正吗? – Kev 2011-11-07 18:20:48

+1

链接已更新。谢谢。 – thraxil 2011-11-10 15:31:13