如何用tox-travis分别运行lint与测试?配置问题求助
解决tox-travis在Travis CI上分离lint与测试任务的配置问题
看起来你在配置tox-travis时踩了几个关键的配置坑,导致LINT环境变量无法正确触发lint任务,或者任务不受变量控制。我来帮你梳理问题并给出可行的修正方案:
核心错误分析
Travis配置文件的Python版本格式错误
你的.travis.yml里写了:python: - 3.6, lint这是无效配置——
python字段只能指定纯Python版本号(比如3.6),不能附加lint这类标识。Travis会无法识别这个错误的版本值,直接导致对应任务执行异常。tox-travis的环境变量映射逻辑理解偏差
在tox.ini的[travis:env]部分,你尝试用LINT = yes: py36, lint或LINT = yes: lint,但没搞清楚tox-travis的匹配规则:- 环境变量映射的作用是覆盖默认的Python版本对应关系,而不是追加环境。
- 如果你希望
LINT=yes时只跑lint任务,需要明确让这个变量对应到lint环境,而非和测试环境混在一起。
Testenv命令格式错误
你的[testenv]里把pip install和py.test写在了同一行:commands = pip install -U pip py.test --basetemp={envtmpdir}这会被解析成「安装
pip和py.test包,然后把--basetemp传给pip」,而非执行pytest命令,直接导致测试无法正常运行。
正确配置方案
第一步:修正.travis.yml
移除无效的Python版本条目,通过matrix.include单独定义lint任务,确保每个任务的职责清晰:
language: python python: - 3.6 - 3.5 - 3.4 - 2.7 matrix: include: - python: 3.6 env: LINT=yes # 这个独立job专门用来跑lint install: - pip install -U tox-travis script: tox
第二步:修正tox.ini
调整travis映射规则,明确普通任务和lint任务的触发逻辑,同时修复测试命令格式:
[tox] envlist = py27, py34, py35, py36, lint # 列出所有可能的环境 [travis] # 普通任务:Python版本对应到测试环境 python = 3.6: py36 3.5: py35 3.4: py34 2.7: py27 [travis:env] # 当LINT=yes时,只运行lint环境,覆盖默认的py36映射 LINT = yes: lint [testenv] # 拆分命令,先升级pip再执行测试 commands = pip install -U pip pytest --basetemp={envtmpdir} # 测试环境依赖(根据你的项目实际需求调整) deps = pytest [testenv:lint] # lint任务的执行命令(这里以flake8为例,可替换为你的lint工具) commands = flake8 . # lint环境依赖 deps = flake8
验证效果
- 当Python版本为3.5/3.4/2.7,以及未设置
LINT=yes的3.6任务时,tox会运行对应的pyxx环境,执行测试命令。 - 当Python版本为3.6且设置
LINT=yes时,tox会只运行lint环境,执行lint检查。
这样就能完美实现你想要的:将lint任务分离到单独的Travis job,其他job专注运行测试。
内容的提问来源于stack exchange,提问作者Greg Samson
相关产品推荐
相关产品推荐

