Tox 4环境复用问题:多testenv重复重建解决方案咨询
问题说明
之前用Tox <4.0的时候,执行tox -e lint、tox -e codestyle这些命令,同一个虚拟环境可以直接复用;升级到Tox 4.x之后,每次切换不同的testenv命令,都会弹出类似下面的提示,把现有环境删掉重建,耗时极长:
codestyle: recreate env because env type changed from {'name': 'lint', 'type': 'VirtualEnvRunner'} to {'name': 'codestyle', 'type': 'VirtualEnvRunner'}
codestyle: remove tox env folder .tox/py39
当前配置是将setup、lint、codestyle等多个testenv绑定到同一个envdir = {toxworkdir}/py39下,用于映射Jenkins的各个阶段任务,此前尝试过Stack Overflow上的方案但无效,现寻求可复用环境的解决办法,包括插件的安装与使用方式。
解决办法
方案1:统一环境标识(无需插件)
Tox 4.x会把testenv的名称作为环境类型的判定依据之一,所以即使多个env指向同一个目录,也会被识别为不同环境触发重建。只需给这些共享环境统一设置一个env_type_name即可解决:
打开你的tox.ini,在共享的[testenv:{setup,lint,codestyle,docstyle,tests,doc-linux,doc-darwin,doc-win32}]段落中添加一行:
env_type_name = py39-shared
修改后的段落示例:
[testenv:{setup,lint,codestyle,docstyle,tests,doc-linux,doc-darwin,doc-win32}] basepython=python3.9 envdir = {toxworkdir}/py39 env_type_name = py39-shared # 新增该行 setenv = PROJECT_NAME = project_name passenv = WINDIR # 后续install_command、platform、deps、commands配置保持不变
这样所有绑定的testenv会被识别为同一环境类型,不会再触发无意义的重建。
方案2:使用tox-recreate-filter插件(方案1无效时尝试)
如果方案1不生效,可以通过插件过滤重建触发条件:
- 安装插件:
pip install tox-recreate-filter
- 在
tox.ini的[tox]段落中添加配置,忽略环境名称变化导致的重建:
[tox] # 保留原有配置 ignore_basepython_conflict=false recreate_filters = env_type.name # 忽略env_type中name字段的差异
验证
修改配置后,先执行tox -e lint,再执行tox -e codestyle,观察是否不再出现删除环境重建的提示,直接复用已有的.tox/py39环境即可。
内容的提问来源于stack exchange,提问作者Marcus

