angular-seed+husky的precommit钩子遇lint错误仍允许提交的求助
我来帮你搞定这个问题!从你的描述来看,核心问题出在npm run lint命令的退出码上——husky是根据整个precommit脚本的最终退出码来决定是否阻止提交的。如果npm run lint明明检测到错误,却返回了表示“成功”的0退出码,那整个npm test && npm run lint脚本就会因为最终返回0而被husky判定为执行成功,从而允许提交。
第一步:确认lint命令的退出码
先手动验证一下npm run lint在有错误时的返回值:
- 故意在代码里留一个lint错误(比如不符合规则的变量命名、未格式化的代码)
- 在终端运行
npm run lint,你应该能看到错误输出 - 紧接着运行:
- macOS/Linux:
echo $? - Windows:
echo %errorlevel%
如果返回的是0,那说明你的lint工具没有在发现错误时正确返回非0的退出码,这就是问题根源。
- macOS/Linux:
第二步:修复lint脚本配置
针对angular-seed常用的tslint/eslint工具,这里给出几种常见的修复方案:
情况1:lint脚本包含--fix参数
如果你的package.json里lint脚本是这样的:
"scripts": { "lint": "tslint \"src/**/*.ts\" --fix" }
--fix参数会让lint工具自动修复一些错误,但如果存在无法自动修复的错误,部分旧版本的lint工具可能仍然返回0退出码。解决方法是去掉--fix,或者先修复再重新检查:
"scripts": { "lint": "tslint \"src/**/*.ts\" --fix && tslint \"src/**/*.ts\"" }
这样先自动修复可修复的错误,再执行一次lint检查,只要还有未解决的错误,第二次lint就会返回非0退出码。
情况2:lint工具配置问题
检查你的lint配置文件(比如tslint.json或.eslintrc),确保没有设置会让工具忽略错误返回0的选项。比如某些自定义规则可能被错误配置为警告而非错误,警告不会影响退出码,只有错误才会。
情况3:升级husky或lint工具
你当前使用的husky是0.14.3,版本比较老旧,可能存在一些兼容性问题。尝试升级到最新版:
npm install husky@latest --save-dev
同时也确保你的lint工具(tslint/eslint)是最新兼容版本,避免因版本不匹配导致的退出码异常。
第三步:验证修复效果
修改完配置后,再次故意留一个lint错误,执行git commit,这时husky应该会在lint出错时返回非0退出码,控制台显示错误信息并阻止提交,和npm test失败时的行为一致。
内容的提问来源于stack exchange,提问作者Ashwin Suryawanshi

