38

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

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

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

4

2 回答 2

21

我只是在工作中使用 pip、Fabric 和 git 设置了类似的东西。流程基本上是这样的,并且大量借鉴了这个脚本

  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什么都不做

这其中最神奇的部分是传递你想要 git 的任何树状结构,并让它进行打包(来自 Fabric)。通过使用或其他任何方法git archive my-branchgit archive 1d02afc我可以保证在我的远程机器上安装正确的软件包。

我走这条路是因为如果软件包在发布之间没有改变,我真的不想让额外的美德四处飘荡。我也不喜欢在我自己的源代码树中拥有我所依赖的实际包的想法。

于 2010-02-11T08:13:02.823 回答
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)

于 2010-02-11T02:46:41.790 回答