~/journal/2025/07/claude-code-hooks-automation-guide

用 Claude Code Hooks 自动格式化与 lint

如何利用 Claude Code hooks 在文件被修改时自动运行代码格式化和 lint 命令(如 mix format 或 prettier)。

发布
阅读时间
2 分钟
标签
AIClaude Code

本页由 AI 从原文翻译。

使用 Claude Code 时,每次 AI 编辑后手动运行格式化工具(mix format、prettier、rubocop)和 linter 很快就会变得烦人。

Claude Code 内置了 Hooks 机制,可以在工作流的关键节点自动执行指定的 shell 命令——比如在工具刚完成文件编辑之后。

下面介绍如何配置它们,以及我在项目中的用法。

配置作用域

Hooks 在 Claude Code 的 settings JSON 文件中配置,共有三个层级的作用域:

  • ~/.claude/settings.json — 全局用户设置(适用于所有项目)
  • .claude/settings.json — 项目设置(提交到 git,与团队成员共享)
  • .claude/settings.local.json — 本地项目覆盖(gitignored,仅限个人机器)

基础设置:文件编辑时格式化

要让 Claude Code 每次修改文件后都运行 mix format 这样的格式化工具,可以配置一个 PostToolUse hook,并用匹配器指定 Edit 工具:

json
{
  "hooks": {
    "PostToolUse": [
      {
        "matcher": "Edit",
        "hooks": [
          {
            "type": "command",
            "command": "mix format"
          }
        ]
      }
    ]
  }
}

有了这个 .claude/settings.json,你就不用再担心未格式化的代码混进 diff 里了。

触发点与匹配器

Claude Code 提供了几个触发点:

  • PreToolUse:在工具执行前运行,适合日志记录或校验。
  • PostToolUse:在工具成功完成后运行,最适合格式化器和 linter。
  • Stop:在 Claude 完成对提示的回复后运行。
  • Notification:在 Claude 发送通知时触发。

matcher 字段控制哪个工具会触发 hook:

  • "matcher": "Edit":仅在文件编辑时触发。
  • "matcher": "Edit|Write":用正则匹配多个工具(例如部分编辑和整文件写入)。
  • "matcher": "Bash":在命令执行时触发。
  • 省略匹配器:该触发点的每个事件都会运行。

多命令示例

你可以在单个触发点下串联多个命令。例如,每次文件修改时同时运行格式化器和严格 linter,并记录 shell 命令:

json
{
  "hooks": {
    "PostToolUse": [
      {
        "matcher": "Edit|Write",
        "hooks": [
          {
            "type": "command",
            "command": "mix format"
          },
          {
            "type": "command",
            "command": "mix credo --strict"
          }
        ]
      }
    ],
    "PreToolUse": [
      {
        "matcher": "Bash",
        "hooks": [
          {
            "type": "command",
            "command": "echo \"[$(date)] Running: $CLAUDE_TOOL_INPUT\" >> .claude/command_log.txt"
          }
        ]
      }
    ]
  }
}

总结

为项目默认格式化器配置一个简单的 PostToolUse hook 只需两分钟,却能省去 AI 辅助编辑后手动清理的麻烦。如果你在多种语言间切换,把与语言无关的偏好放进用户设置,把项目专属的 linter 放进 .claude/settings.json,就能保持整洁和可预测。

Epona
作者Epona

There's nothing wrong with having a little fun

x.com/simura_epona

相关文章

正在加载评论…