只是好奇人们如何结合 virtualenv 部署他们的 Django 项目
- 更具体地说,您如何使您的生产 virtualenv 与您的开发机器正确同步?
我将 git 用于 scm,但在 git repo 中没有我的 virtualenv - 我应该,还是最好使用 pip freeze,然后使用 freeze 输出在服务器上重新创建环境?(如果你这样做,你能否描述一下这些步骤 - 我发现关于解冻过程的好的文档很少 -pip install -r freeze_output.txt可能吗?)
只是好奇人们如何结合 virtualenv 部署他们的 Django 项目
我将 git 用于 scm,但在 git repo 中没有我的 virtualenv - 我应该,还是最好使用 pip freeze,然后使用 freeze 输出在服务器上重新创建环境?(如果你这样做,你能否描述一下这些步骤 - 我发现关于解冻过程的好的文档很少 -pip install -r freeze_output.txt可能吗?)
我只是在工作中使用 pip、Fabric 和 git 设置了类似的东西。流程基本上是这样的,并且大量借鉴了这个脚本:
git log -1 --format=format:%h TREEISH。这给了我们SHA_OF_THE_RELEASEgit log -1 --format=format:%h SHA_OF_THE_RELEASE requirements.txt。这会吐出哈希的简短版本,例如1d02afc此特定版本的该文件的 SHA。1d02afc,则创建一个新的 virtualenv 并使用pip install -E /path/to/venv/1d02afc -r /path/to/requirements.txtpath/to/venv/1d02afc什么都不做这其中最神奇的部分是传递你想要 git 的任何树状结构,并让它进行打包(来自 Fabric)。通过使用或其他任何方法git archive my-branch,git archive 1d02afc我可以保证在我的远程机器上安装正确的软件包。
我走这条路是因为如果软件包在发布之间没有改变,我真的不想让额外的美德四处飘荡。我也不喜欢在我自己的源代码树中拥有我所依赖的实际包的想法。
我使用这个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)