Claude Code 最佳实践指南
我们最近发布了 Claude Code,这是一个用于智能体编程的命令行工具。作为一项研究项目,Claude Code 为 Anthropic 的工程师和研究人员提供了一种更原生的方式,将 Claude 集成到他们的编码工作流中。
Claude Code 故意设计得较为底层且不强制使用特定工作流,为用户提供接近原始模型的访问能力,同时保持灵活、可定制、可编写脚本并确保安全性,是一款功能强大的工具。然而,这种灵活性也带来了学习曲线,尤其对于刚接触智能体编程的工程师——直到他们建立起自己的最佳实践为止。
本文介绍了一些已被证明行之有效的通用模式,无论是 Anthropic 内部团队,还是在各种代码库、语言和环境中使用 Claude Code 的外部工程师,都从中受益。本文列出的内容并非铁律,也不适用于所有场景;请将这些建议视为起点。我们鼓励你大胆尝试,找到最适合自己的方式!
需要更详细的信息?我们的完整文档 claude.ai/code 包含本文提及的所有功能,并提供额外示例、实现细节和高级技巧。
- 自定义你的配置
Claude Code 是一个能自动将上下文信息拉入提示词的智能体编程助手。这种上下文收集会消耗时间和 token,但你可以通过调整环境来优化。
a. 创建 CLAUDE.md
文件
CLAUDE.md
是一个特殊文件,当开始会话时,Claude 会自动将其内容纳入上下文。因此,它是记录以下信息的理想位置:
- 常用的 bash 命令
- 核心文件和工具函数
- 代码风格指南
- 测试说明
- 仓库协作规范(例如分支命名规则、合并还是变基等)
- 开发环境设置(例如 pyenv use、哪些编译器可用)
- 项目特有的异常行为或警告
- 任何你想让 Claude 记住的信息
CLAUDE.md
文件没有强制格式要求。我们建议保持内容简洁且易于人类阅读。例如:
# Bash 命令
- npm run build:构建项目
- npm run typecheck:运行类型检查
# 代码风格
- 使用 ES 模块语法(import/export),而非 CommonJS(require)
- 尽可能解构导入(例如 import { foo } from 'bar')
# 工作流
- 完成一系列代码修改后,务必进行类型检查
- 为提升性能,尽量只运行单个测试,而非整个测试套件
你可以将 CLAUDE.md
文件放在多个位置:
- 仓库根目录,或你运行
claude
命令的地方(最常见用法)。建议将其命名为CLAUDE.md
并提交到 git,以便在不同会话和团队成员之间共享;也可命名为CLAUDE.local.md
并加入.gitignore
- 你运行
claude
目录的任意父目录:这在单体仓库中特别有用。例如你在root/foo
运行claude
,而root/CLAUDE.md
和root/foo/CLAUDE.md
中都有CLAUDE.md
文件,这两者都会被自动拉入上下文 - 你运行
claude
目录的任意子目录:与上述情况相反,此时 Claude 会在你处理子目录文件时按需拉入CLAUDE.md
文件 - 家目录(
~/.claude/CLAUDE.md
),这样会在所有你的 claude 会话中生效
运行 /init
命令时,Claude 将自动为你生成一个 CLAUDE.md
文件。
b. 优化你的 CLAUDE.md
文件
你的 CLAUDE.md
文件会成为 Claude 提示词的一部分,因此应像优化常用提示词一样不断改进。常见错误是添加大量内容而未迭代其有效性。请花时间实验,确定何种内容能让模型更好地遵循指令。
你可以手动向 CLAUDE.md
添加内容,或按下 #
键给出指令,Claude 会自动将其整合进相应的 CLAUDE.md
文件。许多工程师在编码时常按 #
记录命令、文件和风格规范,随后将 CLAUDE.md
的更改提交给团队,使其他人也能受益。
在 Anthropic,我们有时会用 提示词优化器 处理 CLAUDE.md
文件,并经常调整指令(例如用 "IMPORTANT" 或 "YOU MUST" 强调)以提高指令遵从性。
c. 精心管理 Claude 的允许工具列表
默认情况下,Claude Code 会对任何可能修改系统的操作请求权限:文件写入、许多 Bash 命令、MCP 工具等。我们出于安全优先的考虑,特意采用这种保守设计。你可自定义白名单,允许你认为安全的额外工具,或允许可轻松撤销但可能存在风险的工具(如文件编辑、git commit
)。
有四种管理允许工具的方法:
- 会话中选择“始终允许”
- 启动 Claude Code 后使用
/permissions
命令,添加或移除工具。例如添加Edit
以始终允许文件编辑,Bash(git commit:*)
以允许提交,mcp__puppeteer__puppeteer_navigate
以允许通过 Puppeteer MCP 服务器导航 - 手动编辑
.claude/settings.json
或~/.claude.json
(建议将前者加入源代码控制,与团队共享) - 使用
--allowedTools
CLI 标志 设置会话级权限
d. 若使用 GitHub,请安装 gh CLI
Claude 知道如何使用 gh
CLI 与 GitHub 交互,用于创建 issues、打开 pull requests、读取评论等。若未安装 gh
,Claude 仍可通过 GitHub API 或 MCP 服务器(如果已安装)与 GitHub 通信。
- 为 Claude 添加更多工具
Claude 可访问你的 shell 环境,你可像为自己搭建环境一样,为它创建一组便捷脚本和函数。它还可以通过 MCP 和 REST API 使用更复杂的工具。
a. 将 Claude 与 bash 工具结合使用
Claude Code 继承了你的 bash 环境,因此能访问所有你的工具。虽然 Claude 熟悉诸如 Unix 工具和 gh
等常用工具,但除非明确告知,否则它并不知道你的自定义 bash 工具:
- 告诉 Claude 工具名称及使用示例
- 让 Claude 运行
--help
查看工具文档 - 在
CLAUDE.md
中记录常用工具
b. 将 Claude 与 MCP 结合使用
Claude Code 可同时作为 MCP 服务器和客户端。作为客户端,它可以连接任意数量的 MCP 服务器,通过三种方式访问其工具:
- 项目配置(在该目录运行 Claude Code 时可用)
- 全局配置(所有项目中可用)
- 检入的
.mcp.json
文件(代码库中所有开发者均可使用)。例如,你可以在.mcp.json
中添加 Puppeteer 和 Sentry 服务器,使每位开发者都能开箱即用地使用这些工具。
使用 MCP 时,启动 Claude 时加上 --mcp-debug
标志有助于识别配置问题。
c. 使用自定义斜杠命令
对于重复性工作流(如调试循环、日志分析等),可将提示词模板存储在 .claude/commands
文件夹的 Markdown 文件中。当你输入 /
时,这些模板会出现在斜杠命令菜单中。你可以将这些命令提交到 git,让团队其他成员也能使用。
自定义斜杠命令可包含特殊关键字 $ARGUMENTS
来传入参数。
例如,以下斜杠命令可用于自动拉取并修复 GitHub issue:
请分析并修复 GitHub issue:$ARGUMENTS。
请按以下步骤操作:
1. 使用 `gh issue view` 获取 issue 详细信息
2. 理解 issue 中描述的问题
3. 在代码库中搜索相关文件
4. 实施必要的更改以修复问题
5. 编写并运行测试以验证修复
6. 确保代码通过 linting 和类型检查
7. 创建描述性提交信息
8. 推送并创建 PR
请记住在所有 GitHub 相关任务中使用 GitHub CLI (`gh`)。
将上述内容放入 .claude/commands/fix-github-issue.md
后,即可在 Claude Code 中通过 /project:fix-github-issue
命令使用。例如,/project:fix-github-issue 1234
即可让 Claude 修复 issue #1234。同样,你可将个人命令添加到 ~/.claude/commands
文件夹,使其在所有会话中可用。
- 尝试常见工作流
Claude Code 不强制使用特定工作流,给予你充分的灵活性。在这一灵活性空间内,我们的用户社区已涌现出几种有效且成功的模式:
a. 探索、规划、编码、提交
这是一种适用于多数问题的通用工作流:
让 Claude 阅读相关文件、图片或 URL,你可以提供一般性指引(如“读处理日志的文件”)或具体文件名(如“读 logging.py”),但要明确告诉它目前不要写代码。 1. 在此阶段,尤其对于复杂问题,应积极使用子智能体(subagents)。让 Claude 使用子智能体验证细节或探究其疑问,尤其是在对话或任务初期,通常能保留上下文且不会明显损失效率。
让 Claude 为解决特定问题制定计划。我们建议使用“think”一词触发扩展思考模式,使 Claude 有更多计算时间来更深入评估各种选项。这些特定短语直接对应系统中不同级别的思考预算:“think” < “think hard” < “think harder” < “ultrathink”。每个级别为 Claude 分配的思考预算逐步增加。 1. 如果此步骤结果合理,可让 Claude 用文档或 GitHub issue 记录计划,以便在实现(第 3 步)不如预期时能回退到此状态。
让 Claude 用代码实现解决方案。这也是一个好时机,可要求它在实现时显式验证方案的合理性。
让 Claude 提交结果并创建 Pull Request。如相关,此时也应让 Claude 更新 README 或变更日志,说明其刚刚所做修改。
第 1-2 步至关重要——缺少这两步,Claude 往往会直接跳到编码。虽然有时这正是你想要的,但要求 Claude 先研究和计划,能显著提升需要深度前期思考的问题的处理效果。
b. 写测试,提交;编码,迭代,提交
这是 Anthropic 员工喜爱的工作流,适用于可通过单元、集成或端到端测试轻松验证的变更。在智能体编程加持下,测试驱动开发(TDD)变得更加强大:
让 Claude 根据预期的输入/输出对编写测试。要明确指出你正在采用测试驱动开发,以防止它为代码库中尚不存在的功能创建模拟实现。
让 Claude 运行测试并确认测试失败。明确要求此阶段不要编写实现代码通常很有帮助。
当你对测试满意时,让 Claude 提交测试。
让 Claude 编写能通过测试的代码,并告知它不要修改测试。要求 Claude 持续迭代,直到所有测试通过。通常需要几次迭代:写代码 -> 运行测试 -> 调整代码 -> 再运行测试。 1. 此阶段可让它使用独立的子智能体验证实现是否没有过拟合测试
当对更改满意时,让 Claude 提交代码。
当 Claude 有明确目标(如视觉原型、测试用例或其他输出)进行迭代时,表现最佳。通过提供测试等预期输出,Claude 可以不断修改、评估结果并逐步改进,直到成功。
c. 写代码,截图结果,迭代
类似于测试工作流,你可以为 Claude 提供视觉目标:
- 让 Claude 能够获取浏览器截图(例如使用 Puppeteer MCP 服务器、iOS 模拟器 MCP 服务器,或手动复制/粘贴截图)。
- 通过复制/粘贴、拖放或提供图片路径,将视觉原型给到 Claude。
- 让 Claude 用代码实现设计,截图结果,并持续迭代直到结果与原型匹配。
- 当你满意时,让 Claude 提交。
与人类相似,Claude 的输出通常会随着迭代显著提升。初版可能尚可,但经过 2-3 次迭代后通常会好得多。为 Claude 提供查看其输出的工具,才能获得最佳结果。
d. 安全的“YOLO”模式
你可以使用 claude --dangerously-skip-permissions
跳过所有权限检查,让 Claude 无中断运行直至完成,而不是监督它。这种模式适用于修复 lint 错误或生成样板代码等工作流。
允许 Claude 运行任意命令有风险,可能导致数据丢失、系统损坏,甚至数据泄露(如通过提示词注入攻击)。为最小化风险,请在无网络连接的容器中使用 --dangerously-skip-permissions
。可参考此使用 Docker Dev 容器的 参考实现。
e. 代码库问答
初到新代码库时,可使用 Claude Code 进行学习和探索。你可以像结对编程时向项目中的另一位工程师提问那样问 Claude。Claude 可以自主搜索代码库,回答一般性问题,例如:
- 日志系统是如何工作的?
- 如何创建新的 API 端点?
foo.rs
文件第 134 行的async move { ... }
做了什么?CustomerOnboardingFlowImpl
处理了哪些边界情况?- 为何在第 333 行调用
foo()
而不是bar()
? baz.py
第 334 行的等效 Java 实现是什么?
在 Anthropic,这种用法已成为核心入职工作流,显著缩短了上手时间,并减轻了其他工程师的负担。无需特殊提示!只需提问,Claude 就会探索代码以寻找答案。
f. 让 Claude 与 git 交互
Claude 能有效处理许多 git 操作。许多 Anthropic 工程师将 Claude 用于 90% 以上的 git 操作:
- 搜索 git 历史 以回答诸如“v1.2.3 包含了哪些变更?”、“谁负责这个特性?”或“为何这个 API 要如此设计?”等问题。明确提示 Claude 查阅 git 历史以回答此类查询很有帮助。
- 编写提交信息:Claude 会自动查看你的变更和近期历史,综合所有相关上下文撰写提交信息
- 处理复杂 git 操作,例如恢复文件、解决变基冲突,以及比较和移植补丁
g. 让 Claude 与 GitHub 交互
Claude Code 可管理许多 GitHub 操作:
- 创建 Pull Requests:Claude 理解缩写 “pr”,并会根据差异和上下文生成合适的提交信息。
- 一键解决问题:对于简单的代码审查评论,只需告诉 Claude 修复 PR 中的评论(可选地给出更具体指示),完成后推送到 PR 分支。
- 修复构建失败 或 Linter 警告
- 分类和筛选待处理 Issues:让 Claude 循环遍历所有开放的 GitHub Issues
这消除了记住 gh
命令行语法的需要,并自动化了日常任务。
h. 让 Claude 处理 Jupyter 笔记本
Anthropic 的研究人员和数据科学家使用 Claude Code 读写 Jupyter 笔记本。Claude 能解读输出(包括图片),提供了一种快速探索和与数据交互的方式。没有强制的工作流或提示,但我们推荐的工作流是:在 VS Code 中将 Claude Code 和 .ipynb
文件并排打开。
你也可以让 Claude 在展示给同事之前清理或美化 Jupyter 笔记本。明确告诉它让笔记本或其数据可视化“美观”通常有助于提醒它优化人类的阅读体验。
- 优化你的工作流
以下建议适用于所有工作流:
a. 指令要具体
Claude Code 的成功率在指令越具体时越高,尤其是在初次尝试时。事先给出明确指示,可减少后续调整的需求。
例如:
不佳 | 良好 |
---|---|
为 foo.py 添加测试 | 为 foo.py 编写一个新测试用例,覆盖用户未登录这一边界情况。避免使用模拟 |
为什么 ExecutionFactory 有如此奇怪的 API? | 查阅 ExecutionFactory 的 git 历史,总结其 API 的演变过程 |
添加一个日历组件 | 查看首页上现有组件的实现方式,理解代码和接口分离的模式。HotDogWidget.php 是一个很好的起点。然后遵循这一模式,实现一个新的日历组件,允许用户选择月份并通过向前/向后翻页选择年份。从头构建,只能使用代码库中已用的库 |
Claude 能推断意图,但无法读心。越具体,越能与预期对齐。
b. 给 Claude 提供图片
Claude 能通过多种方法出色处理图片和图表:
- 粘贴截图(小技巧:在 macOS 上按 cmd+ctrl+shift+4 截图到剪贴板,然后按 ctrl+v 粘贴。注意这不是通常在 Mac 上使用的 cmd+v,且远程操作无效。)
- 直接拖放图片到提示输入框
- 提供图片的文件路径
在以设计原型作为 UI 开发参考点,或分析调试视觉图表时,这尤其有用。若不添加视觉内容到上下文,也仍可明确告诉 Claude 结果的视觉美观性很重要。
c. 提及你希望 Claude 查看或操作的文件
使用 Tab 补全,可快速引用仓库中任意位置的文件或文件夹,帮助 Claude 找到或更新正确资源。
d. 给 Claude 提供 URL
在提示中粘贴特定 URL,让 Claude 获取并阅读。为避免对相同域名(如 docs.foo.com)重复请求权限,可使用 /permissions
将域名加入白名单。
e. 提前并频繁纠正方向
虽然自动接受模式(按 Shift+Tab 切换)可让 Claude 自主工作,但你通常会通过积极参与和引导获得更好的结果。最好的做法是在开始时彻底向 Claude 解释任务,同时也可以随时纠正其方向。
以下四个工具可帮助纠正方向:
- 在编码前让 Claude 制定计划。明确告知在确认计划合理前不要编码。
- 按 Esc 键中断 Claude 在任何阶段(思考、工具调用、文件编辑)的操作,保留上下文以便你重新引导或扩展指令。
- 双击 Esc 键回溯历史,编辑之前的提示,并探索不同方向。可以反复编辑提示直到获得满意结果。
- 让 Claude 撤销更改,通常与上述方法结合使用,以尝试不同路径。
尽管 Claude Code 偶尔能第一次就完美解决问题,但使用这些纠正工具通常能更快获得更好的解决方案。
f. 使用 /clear
保持上下文聚焦
长时间会话中,Claude 的上下文窗口可能充满不相关的对话、文件内容和命令,这会降低性能,有时还会干扰 Claude。在任务之间频繁使用 /clear
命令可重置上下文窗口。
g. 复杂工作流使用清单和草稿纸
对于多步骤的大任务或需要详尽解决方案的任务(如代码迁移、批量修复 lint 错误或运行复杂构建脚本),让 Claude 使用 Markdown 文件(甚至 GitHub issue)作为清单和工作草稿,能提升表现:
例如,修复大量 lint 问题,可按以下步骤进行:
- 让 Claude 运行 lint 命令,并将所有错误(含文件名和行号)写入 Markdown 清单
- 指示 Claude 逐个解决问题,修复并验证后再勾选并进入下一个
h. 将数据传入 Claude
有几种方法可向 Claude 提供数据:
- 直接复制粘贴到提示中(最常用方法)
- 通过管道传入 Claude Code(例如
cat foo.txt | claude
),对日志、CSV 和大数据特别有用 - 让 Claude 通过 bash 命令、MCP 工具或自定义斜杠命令拉取数据
- 让 Claude 读取文件或获取 URL(也适用于图片)
多数会话会结合使用这些方法。例如,你可以通过管道传入日志文件,然后告诉 Claude 使用工具拉取更多上下文来调试日志。
- 使用无头模式自动化你的基础设施
Claude Code 提供无头模式,用于 CI、提交前钩子、构建脚本和自动化等非交互式场景。使用 -p
标志加提示词启用无头模式,使用 --output-format stream-json
获取流式 JSON 输出。
注意:无头模式不会在会话间持久存在,必须在每次会话中触发。
a. 使用 Claude 进行 issue 筛选
无头模式可驱动由 GitHub 事件触发的自动化,例如代码库中创建新 issue 时。例如,公开的 Claude Code 仓库 使用 Claude 检查传入的新 issue 并分配适当标签。
b. 将 Claude 作为 linter 使用
Claude Code 可提供主观代码审查,识别传统 linter 工具检测不到的问题,如拼写错误、陈旧注释、误导性的函数或变量名等。
- 通过多 Claude 工作流提升能力
除了独立使用,一些最强大的应用涉及并行运行多个 Claude 实例:
a. 一个 Claude 写代码;另一个 Claude 验证
一种简单但有效的方法是让一个 Claude 写代码,另一个审核或测试。就像与多名工程师合作,有时独立的上下文更有利:
- 用 Claude 写代码
- 运行
/clear
或在另一终端启动第二个 Claude - 让第二个 Claude 审核第一个 Claude 的工作
- 启动另一个 Claude(或再次
/clear
)读取代码和审核反馈 - 让这个 Claude 根据反馈修改代码
你也可以对测试这样做:让一个 Claude 写测试,另一个 Claude 写出通过测试的代码。你甚至可以让 Claude 实例相互通信,通过给它们分配不同的工作草稿并指定写入和读取哪个。
这种分离方式的结果通常优于让单个 Claude 处理所有事情。
b. 使用多个代码库副本
无需等待 Claude 完成每一步,Anthropic 的许多工程师会:
- 在不同文件夹中创建 3-4 个 git 副本
- 在多个终端标签中打开每个文件夹
- 在每个文件夹中启动 Claude,分配不同任务
- 轮流切换,检查进度并批准/拒绝权限请求
c. 使用 git worktrees
此方法适用于多个独立任务,比多个副本更轻量。git worktrees 允许你从同一个仓库检出多个分支到不同目录。每个 worktree 拥有独立的文件工作目录,同时共享相同的 Git 历史和 reflog。
使用 git worktrees 可让你在项目的不同部分同时运行多个 Claude 会话,每个会话专注于独立任务。例如,你可让一个 Claude 重构认证系统,同时另一个开发完全无关的数据可视化组件。由于任务不重叠,每个 Claude 可全速工作,无需等待对方的更改或处理合并冲突:
- 创建 worktrees:
git worktree add ../project-feature-a feature-a
- 在每个 worktree 中启动 Claude:
cd ../project-feature-a && claude
- 根据需要创建更多 worktrees(在新终端标签中重复步骤 1-2)
一些提示:
- 使用一致的命名规范
- 每个 worktree 对应一个终端标签
- 如果你在 Mac 上使用 iTerm2,设置通知,当 Claude 需要关注时提醒你
- 为不同 worktrees 使用单独的 IDE 窗口
- 完成后清理:
git worktree remove ../project-feature-a
d. 在自定义框架中使用无头模式
claude -p
(无头模式)可编程地将 Claude Code 集成到更大工作流中,同时利用其内置工具和系统提示。无头模式有两种主要使用模式:
分发处理(Fanning out):处理大型迁移或分析(如分析数百条日志的情感或分析数千个 CSV):
让 Claude 写一个脚本生成任务列表。例如生成 2000 个需要从框架 A 迁移到框架 B 的文件列表。
遍历任务,为每个任务编程调用 Claude,并给出任务和可用工具集。例如:
claude -p “将 foo.py 从 React 迁移到 Vue。完成后,必须返回字符串 OK(成功)或 FAIL(失败)。” --allowedTools Edit Bash(git commit:*)
多次运行脚本,并优化你的提示词以获得理想结果。
流水线处理(Pipelining):将 Claude 集成到现有数据/处理流水线:
调用
claude -p “<你的提示>” --json | your_command
,其中your_command
是处理流水线的下一步完成!可选的 JSON 输出有助于为自动化处理提供结构。
对于这两种用例,使用 --verbose
标志调试 Claude 调用可能会有帮助。我们通常建议在生产环境中关闭详细模式,以获得更清爽的输出。
你在使用 Claude Code 时有哪些技巧和最佳实践?@AnthropicAI 让我们看看你在构建什么!
致谢
作者:Boris Cherny。本工作借鉴了 Claude Code 用户社区的广泛最佳实践,他们富有创意的方法和工作流程持续启发着我们。特别感谢 Daisy Hollman、Ashwin Bhat、Cat Wu、Sid Bidasaria、Cal Rueb、Nodir Turakulov、Barry Zhang、Drew Hodun 以及其他许多 Anthropic 工程师,他们对 Claude Code 的宝贵见解和实践经验帮助塑造了这些建议。