Makefile执行make lint报错recipe for target 'lint' failed错误30如何解决
问题排查结果
错误原因
你给出的Makefile本身不存在语法错误,报错是由pylint的退出码机制触发的make默认错误判定逻辑导致的:
- make执行目标下的指令时,默认会校验指令的退出状态码,只要返回非0值就会判定对应规则执行失败,抛出你看到的
recipe for target 'lint' failed报错。 - pylint的退出码采用位掩码设计,不同位对应不同类型的检查结果,并非只有执行失败才会返回非0:
- 位0(值1):检测到Fatal级别的致命问题
- 位1(值2):检测到Error级别的代码错误
- 位2(值4):检测到Warning级别的警告
- 位3(值8):检测到Refactor级别的重构建议
- 位4(值16):检测到Convention级别的代码规范问题
- 位5(值32):pylint本身调用参数错误等使用问题
你遇到的退出码30是2+4+8+16的总和,说明pylint正常完成了代码扫描,只是扫描结果中存在代码错误、警告、重构建议、规范问题四类可优化项,本身pylint执行没有异常。
修复方案
下面是几种常用的修复方式:
方案1:按检查级别设置pylint失败阈值
可以通过--fail-on参数指定只有达到对应级别问题时,pylint才返回非0退出码。比如只在出现Error及以上级别问题时才判定失败:
lint: $(PYTHON) -m pylint --rcfile=.pylintrc --fail-on=Error $(PYTHON_SCRIPTS_LIST)
如果完全不需要pylint返回非0,也可以设置--fail-on=Never。
方案2:忽略pylint的退出码
如果不需要让pylint的检查结果阻塞make流程,可以直接让make忽略该指令的退出码:
- 方式A:在指令前加
-前缀lint: -$(PYTHON) -m pylint --rcfile=.pylintrc $(PYTHON_SCRIPTS_LIST) - 方式B:在指令末尾加
|| true,保证指令最终返回0lint: $(PYTHON) -m pylint --rcfile=.pylintrc $(PYTHON_SCRIPTS_LIST) || true
方案3:自定义退出码过滤规则
如果需要保留部分pylint退出码的判定(比如只在pylint本身调用错误时报错),可以自行过滤退出码:
lint: $(PYTHON) -m pylint --rcfile=.pylintrc $(PYTHON_SCRIPTS_LIST); exit $$(( $$? & 32 ))
上述规则只会在pylint本身使用异常(退出码包含位5,即值32)时返回非0,其他扫描结果的状态码都会被过滤为0。
内容的提问来源于stack exchange,提问作者Olscream
相关产品推荐
相关产品推荐

