如何在Python Poetry中为第三方依赖添加隐式依赖?
以下几种方式可以处理这个问题,按推荐程度排序:
1. 给PackageA打本地补丁(最接近理想方案)
下载PackageA的源码,修改它的setup.py(如果是用Poetry构建则修改pyproject.toml),添加对PackageB的依赖声明——比如在setup.py的install_requires列表里加入"PackageB"。
然后在你的项目中,用Poetry安装这个本地修改后的包:
poetry add ./path/to/modified-packagea
这种方式下,你的项目依然只依赖PackageA,补丁后的PackageA会正确声明对PackageB的依赖,Poetry会自动处理完整的安装逻辑。后续如果PackageA官方修复了依赖问题,直接切换回官方包即可。
2. 声明PackageB为可选依赖并关联场景
在项目的pyproject.toml中,把PackageB设为可选依赖,并创建一个额外依赖组,明确它是PackageA所需的补充依赖:
[tool.poetry.dependencies] python = "^3.8" PackageA = "^1.0.0" PackageB = { version = "*", optional = true } [tool.poetry.extras] packagea-deps = ["PackageB"]
安装时执行:
poetry install --extras "packagea-deps"
这样项目默认安装不会包含PackageB(不会形成直接依赖),但启用该额外组后会自动安装PackageB,满足PackageA的运行需求。
3. 直接添加PackageB并添加注释说明
如果上面的方法都嫌麻烦,直接执行poetry add PackageB,然后在pyproject.toml的PackageB依赖行添加注释,说明它是PackageA缺失的必需依赖:
[tool.poetry.dependencies] python = "^3.8" PackageA = "^1.0.0" PackageB = "*" # PackageA未声明的必需依赖
这种方式最简单,虽然项目会直接依赖PackageB,但后续只要PackageA官方修复了依赖问题,你可以直接删除这一行并执行poetry remove PackageB即可。
注意:不要手动修改poetry.lock文件,Poetry会自动维护这个文件,手动修改容易导致依赖解析错误和版本不一致。
内容的提问来源于stack exchange,提问作者Nathan

