Poetry中能否为含传递依赖的私有包使用explicit优先级?
Poetry中使用
explicit优先级仓库时传递依赖无法找到私有包的问题 问题背景
我有三个由Poetry管理并发布在私有包仓库的Python包A、B、C:
- B依赖A
- C依赖B
- 三者均额外依赖PyPI上的包
使用Poetry 1.5.1时,配置如下:
B/pyproject.toml
[tool.poetry.dependencies] A = {version = "*", source = "my-private"} [[tool.poetry.source]] name = "PyPI" priority = "primary" [[tool.poetry.source]] name = "my-private" url = "https://gitlab.com/api/v4/groups/65473942/-/packages/pypi/simple" priority = "explicit"
C/pyproject.toml
[tool.poetry.dependencies] B = {version = "*", source = "my-private"} [[tool.poetry.source]] name = "PyPI" priority = "primary" [[tool.poetry.source]] name = "my-private" url = "https://gitlab.com/api/v4/groups/65473942/-/packages/pypi/simple" priority = "explicit"
执行poetry lock时:
- 项目B可以正常完成,能从私有仓库找到A,其他依赖从PyPI获取
- 项目C执行失败,无法找到包A,推测Poetry尝试从PyPI获取A(该包仅存在于私有仓库)
核心问题
- 该行为是Poetry的设计意图还是Bug?
- 能否为包含传递依赖的私有仓库包使用
explicit优先级?
解答
1. 这是Poetry的设计意图,并非Bug
explicit优先级的核心逻辑是:只有当依赖在pyproject.toml中明确指定source属性时,才会从对应仓库拉取该依赖。传递依赖不会继承上游包(比如B)中声明的source信息,Poetry会默认使用优先级最高的primary仓库(这里是PyPI)去查找传递依赖A,因此会出现找不到包的情况。
这种设计是为了严格遵循"显式声明"的原则,避免意外从私有仓库拉取未明确指定的包,同时也防止多私有仓库场景下的同名包冲突。
2. 可以使用explicit优先级,但需要额外配置
目前无法仅通过上游包的传递依赖让Poetry自动从explicit优先级仓库拉取传递依赖,必须通过额外配置来明确指定传递依赖的来源。
可行的临时方案(Poetry 1.8.3+)
在项目C的pyproject.toml中,通过**显式组(explicit group)**冗余声明传递依赖A,既不与项目直接依赖混淆,又能指定其来源:
[tool.poetry.dependencies] B = {version = "*", source = "my-private"} [tool.poetry.group.explicit.dependencies] A = {version = "*", source = "my-private"} [[tool.poetry.source]] name = "my-private" url = "https://gitlab.com/api/v4/groups/65473942/-/packages/pypi/simple" priority = "explicit"
该方案符合官方文档要求,但需要手动维护传递依赖,属于临时解决方案。
替代方案(不推荐,安全性较低)
将私有仓库优先级改为default(旧版本Poetry),移除依赖中的source属性,此时所有包会先从私有仓库查找,找不到再 fallback 到PyPI。但这种方式在多私有仓库存在同名包时会失效,且无法避免误装PyPI上的同名包,安全性不如explicit优先级。
内容的提问来源于stack exchange,提问作者eNca
相关产品推荐
相关产品推荐

