使用git管理virtualenv状态:会出现问题吗?
我现在的 git 和 virtualenv 设置得很好,完全符合我的需求,而且到目前为止没有出现任何问题。不过我知道我的设置有点不标准,所以想问问有没有人能告诉我,特别是对 virtualenv 内部工作原理比较熟悉的人,看看我的设置可能会在哪些地方出问题。
我的设置
我的 virtualenv 放在我的 git 仓库里,但 git 被设置成忽略 bin
和 include
这两个文件夹,以及 lib
文件夹里的所有内容,除了 site-packages
文件夹。
更具体地说,我的 .gitignore
文件是这样的:
*.pyc
# Ignore all the virtualenv stuff except the actual packages
# themselves
/bin
/include
/lib/python*/*
!/lib/python*/site-packages
# Ignore easyinstall and setuptools
/lib/python*/site-packages/easy-install.pth
/lib/python*/site-packages/setuptools.pth
/lib/python*/site-packages/setuptools-*
/lib/python*/site-packages/pip-*
通过这种方式,我和其他任何在这个项目上工作的人都可以像平常一样使用 virtualenv 和 pip,但有以下几个好处:
如果有人更新或安装了一个包并推送了他们的更改,其他人拉取这些更改时会自动得到更新:他们不需要注意
requirements.txt
文件是否有变化,也不需要做任何post-receive
钩子的复杂操作。没有网络依赖:让应用程序正常工作的所有代码都在 git 仓库里。
我知道这种方法只适用于纯 Python 包,但目前我只关心这个。
有没有人知道这种方法还有其他我应该注意的问题吗?
3 个回答
在我的虚拟环境中,路径是绝对的,具体来说是在 /lib/python2.7/site-packages
这个地方。例如,在 Django.egg-link
文件里,我看到的路径是 /Users/henry/.virtualenv/mowapp/src/django
(这是在Mac电脑上)。
检查一下你在git里是否有任何绝对路径被记录下来,我觉得这可能是这个方法的一个大问题。
这个问题挺有意思的。我觉得其他两个回答提到了一些很好的具体观点。显然,你已经认真考虑过这个问题,并找到了一个你喜欢的解决方案。不过,我想指出的是,在使用虚拟环境(virtualenv)的人中,似乎存在一种哲学上的分歧。
一部分人,我猜你可能属于这一类,认为本地的虚拟环境是项目的一部分(也就是说,它应该被纳入版本控制)。而另一部分人则认为虚拟环境应该被视为开发过程中的一个产物——也就是说,requirements.txt 文件应该是项目仓库的一部分,但你应该能够根据需要随时删除并重新创建虚拟环境。
我提到这个是因为,当我第一次看到这种区分时,它帮助我更好地理解了虚拟环境的概念。(我属于第二类,顺便说一下,因为我觉得这样更简单、更干净,但这并不是说第一类在你的特定项目中是错误的。)
如果你的 requirements.txt
文件里有任何 -e
项目,也就是说你有一些可编辑的依赖项,这些依赖项是用 这种格式描述的,并且它们使用了 git
这个版本控制系统,那么当你的 src
目录被提交的时候,你很可能会遇到一些问题。如果你只是把 /src
加到你的 .gitignore
文件里,这样可以避免这个问题,但通常情况下,安装时只是会在 site-packages
里添加一个指向这个位置的链接,所以你其实是需要这个目录的!