Tox运行测试无法识别Poetry配置的本地相对路径依赖问题
问题:Tox无法识别Poetry配置的本地相对路径依赖
项目结构
py/ ├─ projects/ │ ├─ project1/ │ │ ├─ ... │ │ ├─ pyproject.toml │ │ ├─ tox.ini ├─ libs/ │ ├─ lib1/ │ │ ├─ ... │ │ ├─ pyproject.toml
现有配置
py/projects/project1/pyproject.toml依赖配置:
[tool.poetry.dependencies] ... lib1 = {path = "../../libs/lib1" }
py/projects/project1/tox.ini测试配置:
[tox] isolated_build = True envlist = py3 minversion = 3.24.4 requires = setuptools >= 60.1.0 [testenv] whitelist_externals = poetry commands = poetry install -v poetry run pytest -vvv
报错现象
日常开发运行功能正常,在project1目录执行poetry run tox触发测试流程时失败,核心报错信息:
ValueError: Directory ../../libs/lib1 does not exist
报错发生在tox构建项目元数据的阶段,提示找不到指定的本地依赖目录。
问题根因
本地开发执行poetry命令时,工作目录是py/projects/project1,../../libs/lib1这个相对路径会基于当前工作目录解析,可以正确定位到lib1的位置,所以流程正常。
tox默认开启isolated_build时,会先将当前项目打包为sdist源码包存放到.tox/.tmp/package/临时构建目录,后续所有依赖解析、安装操作都基于这个临时目录执行。此时解析pyproject.toml里的相对路径时,基准目录变成了深层的临时文件夹,向上两级根本找不到py目录下的libs文件夹,直接触发路径不存在的错误。
解决方案
直接修改tox.ini配置,跳过tox默认的打包安装步骤即可——你已经用poetry全权负责依赖管理和环境操作,不需要tox额外执行打包、安装项目的流程。
修改后的tox.ini内容如下,核心是新增skip_pkg_install配置:
[tox] isolated_build = True envlist = py3 minversion = 3.24.4 requires = setuptools >= 60.1.0 [testenv] skip_pkg_install = True # 跳过tox默认的sdist打包、安装逻辑 whitelist_externals = poetry commands = poetry install -v poetry run pytest -vvv
配置修改后,tox会直接在tox.ini所在的project1源码目录执行后续poetry命令,相对路径可以正确解析,本地依赖lib1就能被正常识别安装。
注意:tox默认会将命令执行的工作目录设置为tox.ini所在目录,不需要额外调整路径配置。
内容的提问来源于stack exchange,提问作者A.B.
相关产品推荐
相关产品推荐

