求助:Buildout未固定依赖egg版本的问题解决方法
解决方案:Buildout中setup_requires依赖不遵循版本锁定的问题
问题核心
你的问题源于**setup_requires的特殊处理机制**:Buildout的[versions]版本锁定默认只作用于包的install_requires,而setup_requires是在源码包构建过程中由setuptools/easy_install独立处理的,会绕过Buildout的版本约束,导致拉取最新版不兼容依赖。此外setuptools_scm在PyPI上的双名称(下划线/破折号)加剧了版本匹配问题。
可行解决方案
1. 使用buildout.dumppickedversions强制锁定所有依赖
这个扩展会捕获所有实际安装的依赖版本(包括setup_requires),生成完整的版本锁定文件:
- 在buildout配置中添加扩展:
[buildout] extensions = buildout.dumppickedversions - 运行
buildout -c test.cfg,会生成picked-versions.cfg文件,里面包含所有依赖的精确版本 - 将
picked-versions.cfg中的内容合并到你的[versions]区块中,覆盖原有配置
2. 手动指定双名称依赖的版本
针对setuptools_scm的双名称问题,在[versions]中同时添加两种命名形式的版本锁定:
[versions] setuptools_scm = 4.1.2 setuptools-scm = 4.1.2 PyYAML = 3.13 python-dateutil = 2.7.5 ua-parser = 0.8.0 zc.recipe.egg = 2.0.7
这样能确保无论setuptools使用哪种名称查找,都会匹配到指定的兼容版本。
3. 预安装setup_requires依赖到Buildout环境
直接将需要的依赖安装到Buildout使用的Python解释器中,让setuptools在构建时直接使用本地版本,无需远程拉取:
# 假设你的Buildout Python在./bin/python ./bin/python -m easy_install setuptools_scm==4.1.2 PyYAML==3.13
之后再运行Buildout,python-dateutil和ua-parser构建时会直接调用已安装的依赖版本。
为什么pip可以正常工作?
pip会解析整个依赖树的版本约束,包括setup_requires,并自动选择符合所有约束的版本;而Buildout的版本锁定机制最初设计时未覆盖setup_requires的处理流程,导致这部分依赖不受控制。
内容的提问来源于stack exchange,提问作者Hugh Ranalli
相关产品推荐
相关产品推荐

