我在考虑把virtualenv的Django web应用程序,我正在我的应用程序的git存储库。这似乎是一个简单的方法来保持部署的简单和容易。有什么理由不让我这么做吗?
当前回答
我以前也这样做,直到我开始使用根据环境不同而编译的库,比如PyCrypto。我的PyCrypto mac无法在Cygwin上运行,也无法在Ubuntu上运行。
管理存储库完全是一场噩梦。
不管怎样,我发现管理pip冻结&一个需求文件都比在git中更容易。它也更干净,因为你可以避免在这些库更新时提交数千个文件的垃圾邮件……
其他回答
我认为最好的是将虚拟环境安装在存储库文件夹中的路径中,也许更好的是使用专用于环境的子目录(我在强制在存储库根文件夹中安装虚拟环境时意外删除了我的整个项目,很好,我将项目保存在Github的最新版本中)。
无论是自动安装程序还是文档都应该将virtualenv路径指示为相对路径,这样在与其他人共享项目时就不会遇到问题。关于包,使用的包保存在pip freeze -r requirements.txt中。
Storing the virtualenv directory inside git will, as you noted, allow you to deploy the whole app by just doing a git clone (plus installing and configuring Apache/mod_wsgi). One potentially significant issue with this approach is that on Linux the full path gets hard-coded in the venv's activate, django-admin.py, easy_install, and pip scripts. This means your virtualenv won't entirely work if you want to use a different path, perhaps to run multiple virtual hosts on the same server. I think the website may actually work with the paths wrong in those files, but you would have problems the next time you tried to run pip.
已经给出的解决方案是在git中存储足够的信息,以便在部署期间创建virtualenv并进行必要的pip安装。通常情况下,人们运行pip freeze来获取列表,然后将其存储在一个名为requirements.txt的文件中。可以用pip install -r requirements.txt加载。RyanBrady已经展示了如何将deploy语句串成一行:
# before 15.1.0
virtualenv --no-site-packages --distribute .env &&\
source .env/bin/activate &&\
pip install -r requirements.txt
# after deprecation of some arguments in 15.1.0
virtualenv .env && source .env/bin/activate && pip install -r requirements.txt
就我个人而言,我只是把这些放在我在做git克隆或git拉之后运行的shell脚本中。
存储virtualenv目录还使处理pip升级变得有点棘手,因为您必须手动添加/删除和提交升级产生的文件。对于requirements.txt文件,只需更改requirements.txt中的适当行,然后重新运行pip install -r requirements.txt。如前所述,这也减少了“提交垃圾邮件”。
如果你只是设置开发环境,然后使用pip冻结文件,caz,使git回购干净。
然后如果进行生产部署,则签入整个venv文件夹。这将使您的部署更具可重复性,不需要那些libxxx-dev包,并避免互联网问题。
所以有两个回购。一个用于您的主要源代码,其中包括一个requirements.txt。和一个env repo,其中包含整个venv文件夹。
我以前也这样做,直到我开始使用根据环境不同而编译的库,比如PyCrypto。我的PyCrypto mac无法在Cygwin上运行,也无法在Ubuntu上运行。
管理存储库完全是一场噩梦。
不管怎样,我发现管理pip冻结&一个需求文件都比在git中更容易。它也更干净,因为你可以避免在这些库更新时提交数千个文件的垃圾邮件……
我使用pip freeze将我需要的包添加到requirements.txt文件中,并将其添加到我的存储库中。我试图想出一种方法来解释为什么要存储整个virtualenv,但我找不到。