Claude Code Hooks 是最被低估的功能之一。它让你在 Claude Code 的关键时间点(写文件后、Session 开始前、提交前)自动执行命令,把重复的手动操作变成自动化。
这篇文章通过 5 个真实场景,从配置到实战完整演示 Hooks 的使用方式。
Hooks 基础:配置在哪里,何时触发
配置文件位置
.claude/
└── hooks/
├── post-write.yaml # 文件写入后触发
├── pre-commit.yaml # Git commit 前触发
├── session-start.yaml # Session 开始时触发
└── session-end.yaml # Session 结束时触发
基本配置格式
# .claude/hooks/post-write.yaml
hooks:
- name: "Hook 名称(描述性)"
trigger: post_write # 触发时机
match: "*.ts,*.tsx" # 匹配文件(支持 glob)
command: "命令 {file}" # 执行的命令({file} 替换为实际文件路径)
timeout: 30 # 超时秒数(默认 30)
on_error: "warn" # 错误处理:warn | fail | ignore触发时机详解
| 触发时机 | 何时执行 | 典型用途 |
|---|---|---|
post_write | Claude Code 写入文件后 | 自动 lint、格式化、类型检查 |
pre_commit | git commit 前 | 运行测试、检查安全 |
session_start | Claude Code Session 开始时 | 加载上下文、检查环境 |
session_end | Session 正常结束时 | 保存状态、清理临时文件 |
实战案例 1:自动 Lint + 格式化
场景:Claude Code 每次写 TypeScript 文件后,自动运行 ESLint 修复和 Prettier 格式化,保证代码规范。
# .claude/hooks/post-write.yaml
hooks:
- name: "TypeScript 自动 lint"
trigger: post_write
match: "*.ts,*.tsx"
command: "npx eslint --fix {file}"
timeout: 15
on_error: "warn" # lint 失败只警告,不中断工作流
- name: "自动格式化"
trigger: post_write
match: "*.ts,*.tsx,*.js,*.jsx,*.css,*.json"
command: "npx prettier --write {file}"
timeout: 10
on_error: "warn"效果:Claude Code 的每次输出都是格式规范的代码,你 Review 的时候不会被格式问题分散注意力。
实战案例 2:写文件后自动运行相关测试
场景:Claude Code 修改了某个文件后,自动运行这个文件对应的测试,立即发现问题。
# .claude/hooks/post-write.yaml
hooks:
- name: "修改后自动运行相关测试"
trigger: post_write
match: "src/**/*.ts"
# 把文件路径转换为测试文件路径
command: |
TEST_FILE=$(echo {file} | sed 's/src\//src\//;s/\.ts/.test.ts/')
if [ -f "$TEST_FILE" ]; then
npx vitest run "$TEST_FILE" --reporter=verbose
fi
timeout: 60
on_error: "warn"更精简的版本(用 Jest 的 --testPathPattern):
hooks:
- name: "自动运行相关测试"
trigger: post_write
match: "src/**/*.ts"
command: "npx jest --testPathPattern={file} --passWithNoTests"
timeout: 60
on_error: "warn"效果:Claude Code 改了代码,立刻知道测试有没有过。不用等你手动 npm test。
实战案例 3:TypeScript 类型检查
场景:每次写完 .ts 文件后自动做类型检查,防止类型错误积累。
# .claude/hooks/post-write.yaml
hooks:
- name: "TypeScript 类型检查"
trigger: post_write
match: "src/**/*.ts,src/**/*.tsx"
command: "npx tsc --noEmit --skipLibCheck 2>&1 | head -20"
timeout: 30
on_error: "warn"Session 结束时全量检查:
# .claude/hooks/session-end.yaml
hooks:
- name: "Session 结束全量类型检查"
trigger: session_end
command: "npx tsc --noEmit"
timeout: 120
on_error: "fail" # 有类型错误时明确报告实战案例 4:提交前安全检查
场景:git commit 前自动检查有无敏感信息(API Key、密码等)混入代码。
# .claude/hooks/pre-commit.yaml
hooks:
- name: "提交前安全扫描"
trigger: pre_commit
command: |
# 检查常见敏感信息模式
if git diff --cached | grep -E '(api_key|secret|password|token)\s*=\s*["\x27][^"\x27]{8,}'; then
echo "⚠️ 发现疑似敏感信息,请检查后再提交"
exit 1
fi
echo "✓ 安全扫描通过"
timeout: 10
on_error: "fail" # 发现问题时阻止提交
- name: "提交前运行测试"
trigger: pre_commit
command: "npm run test:unit -- --passWithNoTests"
timeout: 120
on_error: "fail"实战案例 5:Session 开始时加载上下文
场景:每次 Claude Code Session 开始时,自动加载当天的工作状态(未完成的 PR、当前分支、最近的改动)。
# .claude/hooks/session-start.yaml
hooks:
- name: "加载工作状态"
trigger: session_start
command: |
echo "=== 当前工作状态 ==="
echo "分支: $(git branch --show-current)"
echo ""
echo "最近改动:"
git log --oneline -5
echo ""
echo "未暂存文件:"
git status --short
echo ""
if [ -f ".claude/session-notes.md" ]; then
echo "=== 会话笔记 ==="
cat .claude/session-notes.md
fi
timeout: 10
on_error: "ignore"配合 Session 结束保存:
# .claude/hooks/session-end.yaml
hooks:
- name: "保存会话状态"
trigger: session_end
command: |
cat > .claude/session-notes.md << EOF
# 上次会话笔记($(date '+%Y-%m-%d %H:%M'))
分支: $(git branch --show-current)
最后改动: $(git log --oneline -1)
未提交文件: $(git status --short | head -5)
EOF
timeout: 10
on_error: "ignore"Hooks 的错误处理策略
on_error: "warn" # 命令失败 → 在 Claude Code 里显示警告,继续工作流
on_error: "fail" # 命令失败 → 中断当前操作,让 Claude Code 知道出了问题
on_error: "ignore" # 命令失败 → 静默忽略,继续(适合辅助性操作)选择策略:
- 核心质量检查(测试、类型检查):
fail,让 Claude Code 知道需要修复 - 格式化/Lint:
warn,不阻断工作流但提示需要关注 - 状态加载/日志记录:
ignore,辅助功能失败不影响主流程
常见问题
Hook 没有触发?
- 检查
match模式是否正确匹配文件路径 - 文件路径从项目根目录开始,确保 glob 模式正确
Hook 太慢影响工作流?
- 设置合理的
timeout - 耗时操作考虑移到
session_end而不是post_write
想在 Hook 里知道是哪个文件?
post_write触发时可用{file}变量- 其他触发时机没有文件变量(用 git 命令获取改动文件列表)
来源:Anthropic Claude Code 官方文档 - Hooks | aiorg.dev 最佳实践 | 整理:ClaudeEagle