Husky搭配lint-staged在Lint失败时无限运行问题排查
问题描述
项目结构
client/ .git/ services/ nest-services/ package.json apps/ app1/ .. appn/ // 根目录无package.json
配置背景
为nest-services下的app1添加预提交Lint检查,选用Husky+lint-staged最新版本,相关配置如下:
nest-services/package.json中的prepare脚本:
"prepare": "cd ../../ && husky install services/nest-services/.husky"
- 完整集成配置:
"lint:app1": "eslint apps/app1/src --format table", "husky": { "hooks": { "pre-commit": "lint-staged" } }, "lint-staged": { "apps/app1/src/**/*.ts": [ "eslint apps/app1/src --format table" ] }
services/nest-services/.husky/pre-commit文件内容:
#!/usr/bin/env sh . "$(dirname -- "$0")/_/husky.sh" cd services/nest-services yarn lint:app1
异常现象
文件通过Lint检查时提交流程正常,但一旦Lint失败,lint-staged会持续循环运行无法终止。
问题原因与解决方案
核心问题
你同时配置了两种触发Lint检查的逻辑,导致冲突死循环:
- 一方面通过
package.json的husky.hooks.pre-commit调用lint-staged执行检查 - 另一方面直接在
.husky/pre-commit脚本中手动执行yarn lint:app1
当Lint失败时,lint-staged终止提交,但.husky/pre-commit的脚本会重复触发检查,形成无限循环。
修复步骤
1. 清理冗余的预提交脚本
删除services/nest-services/.husky/pre-commit文件,或清空自定义执行代码,仅保留husky基础加载语句:
#!/usr/bin/env sh . "$(dirname -- "$0")/_/husky.sh"
(package.json中已配置husky钩子调用lint-staged,无需手动在脚本中执行Lint命令)
2. 优化lint-staged配置
当前配置会全量检查app1/src目录,建议改为仅检查暂存区的目标文件,提升效率同时避免不必要的全量扫描:
"lint-staged": { "apps/app1/src/**/*.ts": [ "eslint --format table" ] }
lint-staged会自动将暂存区的ts文件传入eslint,无需手动指定目录。
3. 验证修复
- 修改
app1中的ts文件,故意引入Lint错误(如未使用的变量) - 执行
git add将文件加入暂存区 - 执行
git commit,此时lint-staged会检查目标文件,发现错误后直接终止提交,不会出现循环问题
内容的提问来源于stack exchange,提问作者Pradip
相关产品推荐
相关产品推荐

