# 实现一个 Hook

URL: https://caijiao.org/claude-code-in-action/15-implementing-a-hook
Source: docs/claude-code-in-action/15-implementing-a-hook.md
Description: 通过完整示例学习如何实现一个实用的 Hook，包括配置、测试和优化全过程

原文链接：[https://anthropic.skilljar.com/claude-code-in-action/303246](https://anthropic.skilljar.com/claude-code-in-action/303246)

**标签：** 视频 + 讲义

---

本节通过一个完整的示例，演示如何实现一个实用的 Hook。我们将创建一个在代码修改后自动运行测试的 Hook。

## 场景描述

我们想要实现以下功能：

- 当 Claude 修改代码后，自动运行相关测试
- 如果测试失败，提示用户
- 跳过不需要测试的文件（如文档、配置文件）

## 步骤一：创建 settings.json

首先在 `.claude` 目录下创建或编辑 `settings.json`：

```json
{
  "hooks": {
    "AfterModify": [
      {
        "name": "Run tests after modify",
        "command": "npm test",
        "description": "修改代码后运行测试",
        "runOnlyWhen": "changedFiles匹配 **/*.test.ts && **/*.test.tsx",
        "timeout": 120000,
        "continueOnError": true
      }
    ]
  }
}
```

## 步骤二：理解配置项

- `runOnlyWhen` 使用条件表达式，只在修改了测试文件时运行
- `continueOnError: true` 确保测试失败不会阻止 Claude 继续工作
- `timeout` 设置为 120 秒，给测试足够时间

## 步骤三：测试 Hook

创建 Hook 后，尝试让 Claude 修改一个测试文件，观察 Hook 是否正确触发：

1. 要求 Claude 修改某个测试文件
2. 观察终端输出，看是否运行了测试
3. 检查测试结果反馈

## 步骤四：优化 Hook

根据实际使用体验优化配置：

- 调整条件表达式更精确匹配文件
- 增加多条 Hook 覆盖不同场景
- 调整超时时间避免误判

## 进阶：多条 Hook 组合

可以组合多个 Hook 实现更复杂的工作流：

```json
{
  "hooks": {
    "BeforeModify": [
      {
        "name": "Format code",
        "command": "npm run format"
      }
    ],
    "AfterModify": [
      {
        "name": "Run tests",
        "command": "npm test"
      },
      {
        "name": "Check coverage",
        "command": "npm run coverage"
      }
    ]
  }
}
```

这样实现：修改前自动格式化 → 修改后运行测试 → 测试后检查覆盖率。

---

**下一节：** [16 Hooks 常见坑点](./16-gotchas-around-hooks)
