如何根据nox使用的Python版本通过poetry安装不同本地依赖包
解决Nox多Python版本测试时匹配对应本地依赖包的问题
不建议直接修改pyproject.toml(多会话并行时易引发文件冲突,还会污染本地工作目录),推荐以下两种安全可行的方案:
方案1:在Nox会话中动态安装对应版本的本地包
绕过Poetry的固定依赖配置,手动根据当前测试的Python版本选择匹配的.whl文件安装:
修改noxfile.py如下:
@nox.session(python=["3.10", "3.9"]) def tests(session) -> None: """Run the test suite.""" # 先安装除目标本地包外的所有依赖 session.run("poetry", "install", "--without", "local-package", external=True) # 从会话Python版本中提取版本号后缀,匹配本地包文件名 py_minor_ver = session.python.split(".")[1] local_package_path = f"local_package_py3{py_minor_ver}.whl" # 用pip安装对应版本的本地包 session.run("pip", "install", local_package_path, external=True) # 执行测试 session.run("pytest")
前提:需在
pyproject.toml中将该本地包归类到单独依赖组(比如[tool.poetry.group.local-package.dependencies]),方便用--without参数跳过安装。如果Poetry版本支持,也可直接用--exclude参数指定跳过该包;嫌麻烦的话,也可以先执行完整的poetry install,再用pip install覆盖安装对应版本的本地包(会有警告但不影响功能)。
方案2:使用Poetry的条件依赖配置
直接在pyproject.toml中通过Python版本条件指定对应依赖包,让Poetry自动匹配安装:
[tool.poetry.dependencies] python = "^3.9 || ^3.10" local-package = [ { file = "local_package_py310.whl", python = ">=3.10,<3.11" }, { file = "local_package_py39.whl", python = ">=3.9,<3.10" } ]
配置完成后,原Nox会话代码无需修改,session.run("poetry", "install", external=True)会根据当前Python版本自动选择对应的.whl文件安装。
注意:该方案要求Poetry版本≥1.2,因为1.2版本才正式支持条件依赖特性。
内容的提问来源于stack exchange,提问作者Andi
相关产品推荐
相关产品推荐

