Skip to content

eslint 把 any 定为 warning,而 pre-commit 钩子把 staged 文件的 warning 当 error —— 两处配置各自都对,合起来矛盾 #51

Description

@SongshGeo

eslint.config.js 说 warning 是可以接受的lefthook.yml 说 warning 是不能提交的。两句话都写着理由,而且都成立——但它们不能同时成立。

两处配置

// eslint.config.js:51-55
// The `any`s in this repo are boundary types for untyped upstreams
// (citation-js, pagefind, remark AST nodes). Flagging them as errors
// would only invite suppression comments, and there are currently zero
// suppressions in the codebase — worth keeping it that way.
'@typescript-eslint/no-explicit-any': 'warn',
# lefthook.yml:13
run: npx eslint --max-warnings 0 --no-warn-ignored {staged_files}

warn 这个等级的意思是「这不阻断」。而 pre-commit 钩子只对 staged files 跑,并且 --max-warnings 0——所以对任何被改动过的文件来说,warning 和 error 完全等价。等级设成 warn 的那个决定,只在你不碰这个文件时才生效。

它是怎么暴露的

在 07db67f 里我为了加 @/ 别名改了 src/components/react/pages/SearchPage.tsx 的 import 行。那个文件带着 5 个既存的 no-explicit-any warning——正是上面注释里点名的 pagefind 边界类型。提交被钩子拒绝:

ESLint found too many warnings (maximum: 0).

一个只改 import 路径的动作,被一段配置文件明确声明为可接受的代码挡住了。

出口只有三个:

  1. --no-verify——而 lefthook.yml 自己的注释就说「一个跑 30 秒的 hook 会被 --no-verify 绕过,那比没有 hook 更糟」。这个理由对「被误报绕过」同样成立,而且绕过一次就绕过了全部检查,不只是这一条规则。
  2. 把那些 any 消掉。我这次是这么做的(给 pagefind 的 metadata 标上 Record<string, string>,把挂在 window 上的模块 declare global 而不是两头 as any),现在全仓 0 error 0 warning。但这是一次计划外的类型工作,混进了一个纯结构重构的 commit。
  3. eslint-disable 注释——正是那段注释说要避免的东西。

为什么现在提

当下不疼:全仓警告数是 0,所以没有文件处于被卡状态。这正是把它写下来的时候——下一个 any 边界类型出现时(citation-js 和 remark AST 那两处随时可能再出现),这个陷阱会在某个完全无关的 PR 里再次触发,而那时它看起来会像一个随机的 CI 抽风。

该定的是哪件事

不是「怎么让钩子过」,而是这个仓库对 warning 的态度到底是什么。两个自洽的答案:

A. warning 是「碰到就顺手清掉」的债。 那么现状的行为是对的,只是没写下来。做法:在 eslint.config.js 那段注释里补一句,说明 pre-commit 会把 staged 文件的 warning 当作 error,所以留下一个 any 意味着「下一个改这个文件的人要负责消掉它」。代价是一次无关的改动可能被迫做一份类型工作——像这次一样。

B. warning 就是不阻断的建议。 那么钩子里的 --max-warnings 0 是个 bug,去掉它,让 CI 的 npm run lint 去报告总数。代价是新引入的 warning 不再有任何门禁。

我倾向 A,因为它是唯一能让警告数长期保持在 0 的选项,而事实是它现在就是 0——说明这条规则实际上一直在起作用,只是从没被说出来。但这是维护者的取舍,不是我的。

无论选哪个,npm run lint 和 pre-commit 应该报同一件事。现在它们不是:npm run lint 说「5 problems (0 errors, 5 warnings)」,钩子说「拒绝提交」。

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    tech-debt技术债 / 重构

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions