Pip的pyproject.toml中可选依赖组能否依赖其他可选依赖组?
用pip实现可选依赖组的层级依赖方案
完全可以用pip实现,你遇到的问题是因为之前的写法错误导致拉取旧版本,用PEP 685定义的self语法就能解决,而且你的pip 23.0.1刚好支持这个特性。
正确配置方式
不用在依赖组里写my-package[chem]这种指向自身包名的写法,改用self[xxx]来引用当前包的其他可选依赖组,这样pip会直接解析本地的依赖关系,不会去私有仓库拉取旧版本。
示例pyproject.toml配置:
[project] name = "my-package" version = "1.0.0" [project.optional-dependencies] # 基础可选组 torch = ["torch>=2.0.0"] # chem组依赖torch组 chem = ["self[torch]", "pymatgen>=2023.1.0"] # test组依赖chem组 test = ["self[chem]", "pytest>=7.0.0", "pytest-cov>=4.0.0"]
效果验证
- 执行
pip install .[chem]时,pip会自动安装torch组和chem组的所有依赖,不需要用户手动加torch - 执行
pip install .[test]时,会自动安装torch、chem、test三组的全部依赖,完全避免冗余
为什么之前的写法失效
你之前用my-package[torch]的写法,会让pip去私有仓库查找my-package的对应版本(而不是用当前本地正在安装的包),所以会拉到旧版本。而self是PEP 685专门为这种同一包内extra依赖场景定义的关键字,它明确告诉pip:引用的是当前包的其他可选依赖组,不需要远程拉取。
内容的提问来源于stack exchange,提问作者James
相关产品推荐
相关产品推荐

