将我的virtualenv目录放在git存储库中是否不好?


Answers:


300

我通常pip freeze将所需的软件包放入requirements.txt文件中,然后将其添加到存储库中。我试图思考为什么您要存储整个virtualenv的方法,但是我不能。


81
您可以在存储库中节省不必要的空间,并仍然可以通过单个命令将其部署到新服务器:virtualenv --no-site-packages --distribute .env && source .env / bin / activate && pip install -r requirements.txt
RyanBrady 2011年

2
我给您这个问题的答案,因为它可能是“最佳实践”,而您首先提供了它。我肯定遇到了每个人都提到的一些问题。我估计我将自己弄得一团糟,然后再做你们一直以来建议的事情,并使用pip和需求文件。谢谢你的帮助!
Lyle Pratt

11
如果说pip install mysql-python在64位计算机上,然后有人在32位计算机上尝试使用它,它将无法正常工作。像许多Python模块一样,它使用C模块来提高性能。我想Windows-> Linux也将无法工作。
马特·威廉姆森

7
只是说一句:我们过去有点过时,因为pip(版本太旧)使库变得不可用,从而在站点关闭时强制进行升级。所以...我现在再也不会依赖它pip freeze了。问题是,在强制升级重新部署期间,没有人为此付费,而对于中间升级(“最佳实践”维护),也没有人为此付费。
合同说我没错,2015年

5
请注意@RayanBrady注释:--distribute--setuptools选项现在为空。(发行版,这是setuptools的一个分支,很早以前就已经合并了)。 --no-site-packages已弃用,现在是默认行为
JackNova

48

正如您指出的那样,将virtualenv目录存储在git中将允许您仅通过执行git clone(加上安装和配置Apache / mod_wsgi)来部署整个应用程序。这种方法的一个潜在的重大问题是,在Linux上,完整路径在venv的activate,django-admin.py,easy_install和pip脚本中进行了硬编码。这意味着,如果您想使用不同的路径,也许要在同一台服务器上运行多个虚拟主机,那么您的virtualenv将无法完全正常工作。我认为该网站实际上可能在这些文件中使用了错误的路径,但下一次尝试运行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 clone或git pull之后运行的shell脚本中。

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


4
请注意,--distribute DEPRECATED. Retained only for backward compatibility. This option has no effect.
distribute

1
--no-site-packages在15.1.0中也不推荐使用,因为这是默认设置。
cjs

35

在开始使用根据环境(例如PyCrypto)进行不同编译的库之前,我一直这样做。我的PyCrypto mac无法在Cygwin上运行,也无法在Ubuntu上运行。

管理存储库已成为一场噩梦。

无论哪种方式,我都发现管理点子冻结和需求文件比将其全部保存在git中更容易。它也更加干净,因为随着这些库的更新,您可以避免提交数千个文件的垃圾邮件...


嗯 对于在不同环境中进行不同编译的东西,我绝对不会有问题。我想可能只是为了避免提交垃圾邮件而不应该这样做。
Lyle Pratt

@LylePratt:我认为相反:最好不要在存储库中包含整个virtualenv,以避免使用诸如PyCrypto或PIL这样的强大工具引起的问题。
塔德克2012年

17

我认为出现的主要问题之一是virtualenv可能无法被其他人使用。原因是它始终使用绝对路径。因此,例如,如果您使用virtualenv,/home/lyle/myenv/它将对使用此存储库的所有其他用户都假设相同(其绝对路径必须完全相同)。您不能假定人们使用与您相同的目录结构。

更好的做法是每个人都在建立自己的环境(无论是否带有virtualenv)并在其中安装库。这也使您的代码在不同平台(Linux / Windows / Mac)上的可用性更高,这也是因为在每个平台上都不同地安装了virtualenv。


这对于在SCM中保留virtualenv是个坏主意是正确的,但是值得考虑像@RJBrady的建议或事件bootstrap.py脚本之类的东西,因为有一些方法可以在机器之间重新创建相同的环境。与他人一起工作时非常需要。
ig0774 2011年

我不确定您提到的问题在我的情况下是否确实是一个问题。我的Django应用程序包含一个.wsgi文件,该文件定义了virtualenv相对于其位置的位置(“ ../../env”上2个目录)。因此,在我的情况下,绝对路径问题不应对我产生负面影响...对吗?
Lyle Pratt

如果您始终使用WSGI运行您的应用程序,那么您可能会摆脱它。如果您使用开发服务器(通过manage.py),则肯定会遇到问题。
Torsten Engelbrecht

3

我使用的基本上是David Sickmiller的答案,并且自动化程度更高。我在项目的顶层创建一个(不可执行的)文件,其名称activate如下:

[ -n "$BASH_SOURCE" ] \
    || { echo 1>&2 "source (.) this with Bash."; exit 2; }
(
    cd "$(dirname "$BASH_SOURCE")"
    [ -d .build/virtualenv ] || {
        virtualenv .build/virtualenv
        . .build/virtualenv/bin/activate
        pip install -r requirements.txt
    }
)
. "$(dirname "$BASH_SOURCE")/.build/virtualenv/bin/activate"

(根据David的回答,这是假设您正在执行,pip freeze > requirements.txt以使您的需求列表保持最新。)

以上给出了总体思路;实际的激活脚本(文档),我通常使用是有点更复杂,提供了-q(安静)选项,使用pythonpython3不可用等。

然后,可以从任何当前工作目录中获取该资源并将其正确激活,必要时首先设置虚拟环境。我的顶级测试脚本通常包含以下几行代码,因此无需开发人员先激活即可运行它:

cd "$(dirname "$0")"
[[ $VIRTUAL_ENV = $(pwd -P) ]] || . ./activate

这里的Sourcing ./activate(而不是activate)很重要,因为后者会activate在您的路径中找到其他任何路径,然后再在当前目录中找到其他路径。


喜欢这种方法!听起来很合理,谢谢分享。
Esolitos

我必须更改第一行以[[ $_ != $0 ]] || { echo 1>&2 "source (.) this script with Bash."; exit 2; }检测脚本是否正在执行,而不是在执行脚本
克里斯·

3

在回购协议中包含任何与环境相关的组件或设置作为使用回购协议的关键方面之一不是一个好主意,也许是与其他开发人员共享它。这是在Windows PC(例如Win10)上设置开发环境的方式。

  1. 打开Pycharm,然后在第一页上,选择从您的源代码管理系统中检出项目(在我的情况下,我正在使用github)

  2. 在Pycharm中,导航至设置,然后选择“项目解释器”,然后选择添加新虚拟环境的选项,您可以将其称为“ venv”。

  3. 选择位于C:\ Users {user} \ AppData \ Local \ Programs \ Python \ Python36的基本python解释器(请确保根据安装的内容选择适当的Python版本)

  4. 请注意,Pycharm将创建新的虚拟环境,并在项目文件夹内的venv文件夹下复制python二进制文件和所需的库。

  5. 让Pycharm完成其扫描,因为它需要重建/刷新项目框架

  6. 从git交互中排除venv文件夹(将venv \添加到项目文件夹中的.gitignore文件)

奖励:如果您希望人们轻松(很好,几乎很容易)安装软件所需的所有库,则可以使用

pip freeze > requirements.txt

并将说明放在git上,以便人们可以使用以下命令立即下载所有必需的库。

pip install -r requirements.txt 

2

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

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

实际上,这就是我对自己编写的内部应用程序所做的工作,可以在需要时快速添加新系统的virtualenv。这样,我不必依靠那个点就可以成功下载我的应用程序所需的软件。我也不必担心例如psycopg2的编译我使用。

如果您不知道您的应用程序可以在哪个操作系统上运行,那么最好pip freeze按照此处其他答案中的建议使用。


0

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

自动安装程序或文档都应将virtualenv路径指示为相对路径,这样,与他人共享项目时,您就不会遇到问题。关于软件包,使用的软件包应通过保存pip freeze -r requirements.txt


-1

如果您只是设置开发环境,请使用pip冻结文件,因为caz可以使git repo变得干净。

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

因此,有两个存储库。一个用于您的主要源代码,其中包括requirements.txt。还有一个env存储库,其中包含整个venv文件夹。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.