You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Husky搭配lint-staged在Lint失败时无限运行问题排查

问题描述

项目结构

client/
.git/
services/
    nest-services/
       package.json
       apps/
           app1/
             ..
           appn/
// 根目录无package.json

配置背景

为nest-services下的app1添加预提交Lint检查,选用Husky+lint-staged最新版本,相关配置如下:

  1. nest-services/package.json中的prepare脚本:
"prepare": "cd ../../ && husky install services/nest-services/.husky"
  1. 完整集成配置:
"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"
  ]
}
  1. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.03 18:30:41