Buildout未使用固定版本:指定Django 1.6却安装1.10的问题咨询
解决Buildout跳过Django 1.6锁定安装1.10的问题
哎,这种版本漂移的坑我之前踩过好几次,尤其碰到客户不让升级的情况,真的头疼!咱们一步步来排查解决:
1. 先检查你的[versions]配置是否真的生效
Buildout对包名的大小写特别敏感,PyPI上Django的包名是小写的django,所以你必须在[versions]段里这么写:
[versions] django = 1.6
要是你写成Django = 1.6(首字母大写),Buildout会识别不到这个锁定,直接去装最新兼容的版本,这大概率是最常见的原因!
2. 排查依赖包的版本约束冲突
项目里的其他第三方库(比如django-cms、django-rest-framework这类)可能在自己的setup.py里写了类似django>=1.8的宽松约束,Buildout会优先满足这些依赖的要求,直接跳过你的Django版本锁定。
解决办法:
- 运行
bin/buildout -vvv(多加几个v开启详细日志),看输出里的版本选择逻辑,比如会看到类似Choosing django 1.10 because 'some-package' requires django>=1.8的提示,找到那个搞事情的包。 - 然后在
[versions]段里锁定这个包的兼容Django 1.6的旧版本。比如如果是django-cms,你得找2.4.x系列的版本(它支持Django1.6),然后加上:
[versions] django = 1.6 django-cms = 2.4.8 pytz = 2015.7 # 举个例子,选和Django1.6兼容的旧版本
3. 清理Buildout的缓存
有时候Buildout会缓存之前下载的包,哪怕你后来改了版本锁定,它也可能直接用缓存里的高版本文件。这时候你需要:
- 删除项目根目录下的
eggs/、develop-eggs/文件夹 - 删除用户目录下的
~/.buildout/eggs/缓存目录 - 然后重新运行
bin/buildout -v,让它重新下载正确的Django1.6版本
4. 检查extends配置的干扰
你的配置里提到了extensi...(应该是extends),如果扩展了其他Buildout配置文件,那个文件里的[versions]段可能覆盖了你本地的锁定。解决办法:
- 打开你extends的那个配置文件,检查里面有没有
django = x.x的设置 - 要是有的话,要么修改那个文件,要么确保你本地的
[versions]段在extends之后加载(Buildout是先加载扩展文件,再加载本地配置,所以本地的会覆盖扩展的,但还是要确认)
最后验证
重新运行Buildout后,你可以去项目的eggs/目录里看有没有Django-1.6-pyX.X.egg的文件夹,或者运行bin/django-admin --version确认版本是1.6。
内容的提问来源于stack exchange,提问作者Andre
相关产品推荐
相关产品推荐

