将虚拟环境目录放在我的git仓库里是否不妥?

417 投票
8 回答
211081 浏览
提问于 2025-04-16 20:55

我在考虑把我正在制作的Django网页应用的虚拟环境放在我的应用的git仓库里。这样做似乎可以让部署变得简单方便。有没有什么理由让我不要这么做呢?

8 个回答

42

我以前也是这样做的,直到我开始使用一些根据不同环境编译的库,比如PyCrypto。我的PyCrypto在Mac上能用,但在Cygwin和Ubuntu上就不行了。

这让管理代码库变得非常麻烦。

无论如何,我发现管理pip freeze和一个需求文件比把所有东西放在git里要简单得多。这种方式也更干净,因为你可以避免因为那些库更新而产生成千上万的提交记录。

93

把虚拟环境的目录放在git里,正如你提到的那样,可以让你通过简单的git克隆来部署整个应用(当然还需要安装和配置Apache/mod_wsgi)。不过,这种做法有一个可能比较严重的问题,就是在Linux系统上,虚拟环境的激活脚本、django-admin.py、easy_install和pip脚本里会写死完整的路径。这意味着如果你想用不同的路径,比如在同一台服务器上运行多个虚拟主机,你的虚拟环境可能就不能完全正常工作。我觉得网站可能在那些文件里的路径不对的情况下也能运行,但下次你想用pip的时候就会遇到麻烦。

解决办法,已经有人提过,就是在git里存储足够的信息,这样在部署时你可以创建虚拟环境并进行必要的pip安装。通常人们会运行 pip freeze 来获取依赖包的列表,然后把它存到一个叫requirements.txt的文件里。之后可以用 pip install -r requirements.txt 来加载这些依赖。RyanBrady已经展示了如何把部署的命令串成一行:

# 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

我个人是把这些命令放在一个shell脚本里,在做完git克隆或git拉取后运行。

把虚拟环境的目录存储在git里也让pip的升级变得有点麻烦,因为你需要手动添加、删除和提交升级后产生的文件。而如果有requirements.txt文件,你只需要在requirements.txt里修改相应的行,然后重新运行 pip install -r requirements.txt。正如之前提到的,这样也能减少“提交垃圾”。

468

我使用 pip freeze 命令来获取我需要的包,并把它们放进一个 requirements.txt 文件里,然后把这个文件添加到我的代码库中。我试着想为什么要保存整个虚拟环境,但我想不出来。

撰写回答