Django和VirtualEnv开发/部署最佳实践

时间:2010-02-10 23:14:20

标签: python django git virtualenv

很好奇人们如何将他们的Django项目与virtualenv一起部署

  • 更具体地说,您如何使您的生产virtualenv与您的开发机器正确同步?

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

2 个答案:

答案 0 :(得分:21)

我只是使用pip,Fabric和git设置这样的东西。流程基本上是这样的,并且大量借鉴this script

  1. 在我们的源代码树中,我们维护一个requirements.txt文件。我们会手动维护。
  2. 当我们执行新版本时,Fabric脚本会根据我们传递的任何树木来创建存档。
  3. Fabric会找到我们使用git log -1 --format=format:%h TREEISH部署的SHA。这给了我们SHA_OF_THE_RELEASE
  4. Fabric将使用git log -1 --format=format:%h SHA_OF_THE_RELEASE requirements.txt获取我们的需求文件的最后一个SHA。这会抛出哈希的简短版本,例如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,则不执行任何操作
  6. 这个小魔术部分是传递你想要git的任何树,并让它做包装(来自Fabric)。通过使用git archive my-branchgit archive 1d02afc或其他任何内容,我保证可以在我的远程计算机上安装正确的软件包。

    我走了这条路线,因为如果包裹在发布之间没有变化,我真的不想让额外的虚拟主人浮动。我也不喜欢在我自己的源代码树中拥有我依赖的实际包的想法。

答案 1 :(得分:4)

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

期望名为'requirements'的目录看起来像这样: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,如果你不小心的话< / p>