Django和VirtualEnv开发/部署最佳实践
只是好奇人们如何配合他们的Django项目结合virtualenv
- 更具体地说,你如何保持你的生产virtualenv与你的开发机器正确同步?
我使用git for scm,但是我没有在git repo中使用virtualenv,或者最好是使用pip freeze,然后使用冻结输出在服务器上重新创build环境? (如果你这样做,你能否描述一下这些步骤 – 我在解冻过程中找不到很好的文档 – 就像pip install -r freeze_output.txt
吗?)
我只是用pip,Fabric和git来设置这样的东西。 stream程基本上是这样的,并从这个脚本中大量借鉴:
- 在我们的源代码树中,我们维护一个requirements.txt文件。 我们将手动维护。
- 当我们做一个新版本的时候,Fabric脚本会根据我们传递的信息创build一个存档。
- Fabric将使用
git log -1 --format=format:%h TREEISH
find我们部署的SHA。 这给了我们SHA_OF_THE_RELEASE
- Fabric将使用
git log -1 --format=format:%h SHA_OF_THE_RELEASE requirements.txt
获取我们需求文件的最后一个SHA。 这就吐出了短版本的哈希,就像1d02afc
这是该特定版本的文件的SHA。 - Fabric脚本将查看我们的virtualenvs存储在远程主机上的目录。
- 如果没有名为
1d02afc
的目录,则会创build一个新的virtualenv并使用pip install -E /path/to/venv/1d02afc -r /path/to/requirements.txt
- 如果现有
path/to/venv/1d02afc
,则不做任何事情
- 如果没有名为
这个小魔术的一部分是传递任何你想要的东西,然后让它做包装(来自Fabric)。 通过使用git archive my-branch
, git archive 1d02afc
或其他任何,我保证得到正确的软件包安装在我的远程机器上。
我走了这条路线,因为如果软件包在发行版之间没有改变,我真的不想有额外的virtuenvs浮动。 我也不喜欢在自己的源代码树中拥有我所依赖的实际包的想法。
我使用这个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时,会创buildvirtualenv(如果存在,则擦除前一个),然后安装require / apps.txt中的所有内容。 否则,我不会将任何东西安装到virtualenv中。 如果我想包含一个新的库,我把压缩包放到requirements / src /中,在其中一个文本文件中添加一行并重新运行./bootstrap.py。
bootstrap.py和需求检查到版本控制(也是一个pip.py的副本,所以我甚至不必在任何地方安装系统)。 virtualenv本身不是。 我推送到生产的脚本在每次推送时都会在生产服务器上运行./bootstrap.py。 (bootstrap.py也有一定的长度,以确保它坚持Python 2.5,因为这是我们在生产服务器(Ubuntu Hardy)上的,而我的开发机器(Ubuntu Karmic)默认为Python 2.6,如果你不小心的话)