如何修复“使用PEP 517的包无法构建wheel、无法直接安装”报错
根因定位
报错核心触发点是构建生成的版本号0.0.2.dev1.post1.dev0-g1f5fc90.d20211206不符合PEP 440规范,pip 21.2.4版本已严格执行Metadata 1.2的校验规则,直接阻断了wheel构建流程。
该不合规版本号由项目使用的自动版本生成工具(多为setuptools-scm)输出:当Git工作区存在未提交改动时,工具会自动在基础版本号后追加Git哈希、构建日期等后缀,默认使用连字符-作为分隔符,违反PEP 440版本号格式要求。
永久修复方案
- 修改自动版本生成规则(最推荐)
如果你的项目使用setuptools-scm管理版本,直接在setup.cfg中添加配置,将本地版本标识的分隔符改为PEP 440允许的加号+:
[setuptools_scm] version_scheme = post-release # 自定义本地版本格式,符合PEP440规范 local_scheme = lambda version: f"+g{version.node}.d{version.time.strftime('%Y%m%d')}{'.dirty' if version.dirty else ''}"
配置完成后执行python -m setuptools_scm验证输出,正常会生成类似0.0.2.dev1.post1.dev0+g1f5fc90.d20211206的合规版本号。
- tox环境适配方案
如果仅需要在本地测试阶段规避问题,可在tox.ini的测试环境配置中添加构建参数,允许非PEP440版本的本地安装:
[testenv] install_command = pip install --no-use-pep517 {opts} {packages}
注意该方案仅适用于本地开发测试,正式发布时必须使用合规版本号。
- 固定版本号方案
如果开发阶段不需要自动生成带Git标识的版本,可直接在setup.cfg中硬编码固定版本号,关闭自动版本生成逻辑即可。
验证方法
修改配置后直接运行tox即可复现测试流程,无需提前打Git标签,工作区存在未提交改动时也不会触发版本校验错误。
内容的提问来源于stack exchange,提问作者Julian_Orteil
相关产品推荐
相关产品推荐

