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

2024-05-29 01:45:07 发布

您现在位置:Python中文网/ 问答频道 /正文

只是好奇人们是如何结合virtualenv部署他们的Django项目的

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

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


Tags: pip项目django文档git服务器机器环境
2条回答

我只是在工作中使用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脚本将查找一个目录,其中我们的virtualenv存储在远程主机上。
    1. 如果没有名为1d02afc的目录,将创建一个新的virtualenv,并使用pip install -E /path/to/venv/1d02afc -r /path/to/requirements.txt进行设置
    2. 如果现有的path/to/venv/1d02afc,则不执行任何操作

这个小魔术部分是传递任何你想git的树,并让它做包装(从织物)。通过使用git archive my-branchgit archive 1d02afc或其他方式,我保证在远程计算机上安装正确的软件包。

我走了这条路,因为我真的不想有额外的virtuenv漂浮在周围,如果包没有改变之间的释放。我也不喜欢在我自己的源代码树中拥有我所依赖的实际包的想法。

我用这个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模块分开)和一个src目录,其中包含实际的tarball。

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

bootstrap.py和需求被签入版本控制(也是pip.py的一个副本,所以我甚至不必在系统范围内的任何地方安装它)。virtualenv本身不是这样的。每次我推送到生产服务器上的脚本都会在生产服务器上运行./bootstrap.py。(bootstrap.py也不遗余力地确保它坚持使用Python2.5,因为这就是我们在生产服务器(UbuntuHardy)和my dev machine(UbuntuKarmic)上使用的,如果不小心的话,默认为Python2.6)

相关问题 更多 >

    热门问题