我在考虑把virtualenv的Django web应用程序,我正在我的应用程序的git存储库。这似乎是一个简单的方法来保持部署的简单和容易。有什么理由不让我这么做吗?


当前回答

我以前也这样做,直到我开始使用根据环境不同而编译的库,比如PyCrypto。我的PyCrypto mac无法在Cygwin上运行,也无法在Ubuntu上运行。

管理存储库完全是一场噩梦。

不管怎样,我发现管理pip冻结&一个需求文件都比在git中更容易。它也更干净,因为你可以避免在这些库更新时提交数千个文件的垃圾邮件……

其他回答

我以前也这样做,直到我开始使用根据环境不同而编译的库,比如PyCrypto。我的PyCrypto mac无法在Cygwin上运行,也无法在Ubuntu上运行。

管理存储库完全是一场噩梦。

不管怎样,我发现管理pip冻结&一个需求文件都比在git中更容易。它也更干净,因为你可以避免在这些库更新时提交数千个文件的垃圾邮件……

如果你只是设置开发环境,然后使用pip冻结文件,caz,使git回购干净。

然后如果进行生产部署,则签入整个venv文件夹。这将使您的部署更具可重复性,不需要那些libxxx-dev包,并避免互联网问题。

所以有两个回购。一个用于您的主要源代码,其中包括一个requirements.txt。和一个env repo,其中包含整个venv文件夹。

在回购中包含任何依赖于环境的组件或设置并不是一个好主意,因为使用回购的关键方面之一可能是与其他开发人员共享它。下面是我如何在Windows PC(比如Win10)上设置我的开发环境。

Open Pycharm and on the first page, choose to check out the project from your Source Control System (in my case, I am using github) In Pycharm, navigate to settings and choose "Project Interpreter" and choose the option to add a new virtual environment , you can call it "venv". Choose the base python interpreter which is located at C:\Users{user}\AppData\Local\Programs\Python\Python36 (make sure you choose the appropriate version of Python based on what you have installed) Note that Pycharm will create the new virtual environment and copy python binaries and required libraries under your venv folder inside your project folder. Let Pycharm complete its scanning as it needs to rebuild/refresh your project skeleton exclude venv folder from your git interactions (add venv\ to .gitignore file in your project folder)

好处:如果你想让人们很容易(好吧,几乎很容易)安装你的软件所需的所有库,你可以使用

pip freeze > requirements.txt

并将该指令放在git中,以便人们可以使用以下命令一次性下载所有所需的库。

pip install -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。如前所述,这也减少了“提交垃圾邮件”。

我认为最好的是将虚拟环境安装在存储库文件夹中的路径中,也许更好的是使用专用于环境的子目录(我在强制在存储库根文件夹中安装虚拟环境时意外删除了我的整个项目,很好,我将项目保存在Github的最新版本中)。

无论是自动安装程序还是文档都应该将virtualenv路径指示为相对路径,这样在与其他人共享项目时就不会遇到问题。关于包,使用的包保存在pip freeze -r requirements.txt中。