在我的git仓库里有我的virtualenv目录是不好的?

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

我对virtualenv完全陌生,所以很有可能这是一个非常愚蠢的问题。

我使用pip freeze来获取我需要的包到一个requirements.txt文件中,并将其添加到我的存储库中。 我试图想出一个方法,为什么你会想要存储整个virtualenv,但我不能。

我曾经这样做,直到我开始使用根据环境(如PyCrypto)编译方式不同的库。 我的PyCrypto mac无法在Cygwin上工作在Ubuntu上无法正常工作。

pipe理存储库变成了一个完全的噩梦。

无论哪种方式,我发现pipe理点击冻结和要求文件比在git中的所有更容易。 它也更干净,因为您可以避免数千个文件的提交垃圾邮件,因为这些库得到更新…

如上所述,在git中存储virtualenv目录将允许您通过执行git克隆(以及安装和configurationApache / mod_wsgi)来部署整个应用程序。 这种方法的一个潜在的重要问题是,在Linux上,全path在venv的激活,django-admin.py,easy_install和pip脚本中被硬编码。 这意味着如果你想使用不同的path,你的virtualenv将不能完全工作,也许在同一台服务器上运行多个虚拟主机。 我认为网站实际上可能会在这些文件中出现错误的path,但下次尝试运行pip时会遇到问题。

已经给出的解决scheme是在git中存储足够的信息,以便在部署期间可以创buildvirtualenv并执行必要的pip安装。 通常,人们运行pip freeze来获取列表,然后将其存储在名为requirements.txt的文件中。 它可以用pip install -r requirements.txt加载。 RyanBrady已经展示了如何将部署语句串成一行:

 virtualenv --no-site-packages --distribute .env && source .env/bin/activate && pip install -r requirements.txt 

就个人而言,我只是把它们放在一个shell脚本中,我在做git clone或git pull后运行。

存储virtualenv目录也使得处理pip升级有点棘手,因为您必须手动添加/删除并提交升级产生的文件。 使用requirements.txt文件,只需在requirements.txt中更改相应的行,然后重新运行pip install -r requirements.txt 。 如前所述,这也减less了“提交垃圾邮件”。

我认为发生的一个主要问题是virtualenv可能不能被其他人使用。 原因是它总是使用绝对path。 所以,如果你的virtualenv是在/home/lyle/myenv/那么对于所有其他使用这个仓库的人来说,这个假设都是一样的(它必须是完全相同的绝对path)。 你不能假定人们使用和你一样的目录结构。

更好的做法是每个人都build立自己的环境(无论是否有virtualenv),并在那里安装库。 这也使得你的代码在不同的平台(Linux / Windows / Mac)上更具有可用性,也因为virtualenv在每个平台上安装不同。

如果您知道应用程序将在哪个操作系统上运行,那么我将为每个系统创build一个virtualenv并将其包含在我的存储库中。 然后,我会让我的应用程序检测它正在运行的系统,并使用相应的virtualenv。

系统可以例如使用平台模块来识别。

事实上,这就是我所写的内部应用程序所做的事情,如果需要的话,我可以快速添加新系统的virtualenv。 这样,我不必依赖那个点就能成功下载我的应用程序所需要的软件。 我也不必担心我使用的psycopg2的编译。

如果你不知道你的应用程序可以运行在哪个操作系统上,那么你可能会更好地使用pip freeze就像在这里的其他答案中所build议的那样。

如果你只是设置开发环境,然后使用PIP冻结文件,CAZ,使GIT仓库干净。

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

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