You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

求助: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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.26 11:53:18