教程 claude-code-in-action tutorial

实现一个 Hook

原文链接: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 常见坑点