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

39

我很好奇人们如何将他们的Django项目与virtualenv结合部署

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

我使用git作为源代码管理工具,但是我没有将我的virtualenv放在git仓库中 - 我应该这样做吗?还是最好使用pip freeze,然后使用freeze输出在服务器上重新创建环境?(如果您这样做的话,请描述一下步骤 - 我发现很少有关于解冻过程的文档 - 是否可能类似于pip install -r freeze_output.txt ?)

2个回答

22
我在工作中使用pip、Fabric和git搭建了这样的一个流程。整个流程基本上参考了这个脚本
  1. 我们在源代码树中维护一个requirements.txt文件。我们将手动维护它。
  2. 当我们发布新版本时,Fabric脚本会创建一个基于我们传递的treeish的归档文件。
  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脚本然后会查找一个目录,其中存储着远程主机的虚拟环境。
    1. 如果没有名为1d02afc的目录,则会创建一个新的虚拟环境,并安装所需的包pip install -E /path/to/venv/1d02afc -r /path/to/requirements.txt
    2. 如果存在名为path/to/venv/1d02afc的目录,则不执行任何操作
这个流程的神奇之处在于,通过传递任何你想要的tree-ish值给git,并让它(来自Fabric)进行打包。通过使用git archive my-branchgit archive 1d02afc或其他命令,我可以确保在远程机器上安装正确的软件包。
我选择了这种方式,因为我真的不想在没有更改软件包的情况下让额外的虚拟环境存在。我也不喜欢在我的源代码树中放置我依赖的实际软件包的想法。

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模块分开)和一个包含实际tarballs的src目录。运行./bootstrap.py时,它会创建virtualenv(如果存在则删除之前的虚拟环境),并将所有内容从requirements / apps.txt安装到其中。我不会向virtualenv中安装任何其他东西。如果我想要包含新库,我将tarball放入requirements / src /中,将一行添加到文本文件中,然后重新运行./bootstrap.py。 bootstrap.py和requirements被检入版本控制(还有pip.py的副本,因此我甚至不必在系统范围内安装它)。虚拟环境本身不会被检入。我编写的脚本在每次推送时都在生产服务器上运行./bootstrap.py(bootstrap.py还采取一些措施确保它坚持Python 2.5,因为这是我们在生产服务器上拥有的内容(Ubuntu Hardy),而我的开发机器(Ubuntu Karmic)默认情况下使用Python 2.6,如果您不小心就会出错)。

1
这个答案中的链接坏掉了,请问你能修复一下吗? - Kev

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接