Claude Code在大型代码库中的最佳实践
DataHot 速览
本文是Anthropic关于Claude Code在大型代码库中部署最佳实践的系列文章之一,介绍了在数百万行级单体仓库、遗留系统及多仓库架构中成功采用Claude Code的模式。文章指出Claude Code像软件工程师一样通过文件系统遍历、grep等方式导航代码,无需建立代码库索引。内容涵盖配置、工具链和组织结构上的可复用模式,适合考虑采用Claude Code的工程团队参考。
为什么值得关注:内容聚焦AI编程工具在大型工程代码库的落地实践,与本站数据领域五个范畴均不直接相关。
本文目录 7 节
译文
AI 逐段翻译Claude Code 正在数百万行级的单体仓库、数十年的遗留系统、跨多个仓库的分布式架构以及拥有数千名开发者的组织中投入生产使用。这些环境带来了比较小、较简单的代码库更大的挑战,无论是每个子目录中不同的构建命令,还是分布在多个文件夹且没有共享根的遗留代码。
本文涵盖了我们观察到的成功采用 Claude Code 进行规模化部署的模式。我们使用“大型代码库”一词来指代广泛的部署类型:数百万行的单体仓库、历经数十年构建的遗留系统、跨独立仓库的数十个微服务,或上述任何组合。这还包括那些团队通常不会将其与 AI 编码工具联系起来的语言所编写的代码库,例如 C、C++、C#、Java、PHP。(在这些情况下,Claude Code 的表现比大多数团队预期的要好,尤其是在最近的模型版本中。)虽然每个大型代码库的部署都受其特定的版本控制、团队结构和累积惯例的影响,但本文中的模式普遍适用,是考虑采用 Claude Code 的团队的良好起点。
Claude Code 如何导航大型代码库
Claude Code 像软件工程师一样导航代码库:它遍历文件系统,读取文件,使用 grep 精确定位所需内容,并跨代码库跟踪引用。它在开发人员的机器上本地运行,不需要构建、维护或上传代码库索引到服务器。
RAG 驱动的 AI 编码工具通过嵌入整个代码库并在查询时检索相关片段来工作。在大型规模下,这些系统可能会失败,因为嵌入管道无法跟活跃的工程团队保持同步。当开发人员查询索引时,索引反映的是数周、数天甚至数小时前的代码库状态。检索随后返回两周前团队重命名的函数,或引用上次迭代中已删除的模块,且没有指示任何一项已过时。
基于代理的搜索避免了这些故障模式。当数千名工程师提交新代码时,无需维护嵌入管道或集中索引。每个开发人员的实例都基于实时代码库工作。
但这种方法有一个权衡:当 Claude 有足够的起始上下文知道去哪里查找时,它效果最好。这意味着 Claude 的导航质量受到代码库设置方式的影响,通过 CLAUDE.md 文件和技能来分层添加上下文。如果你要求它在十亿行的代码库中查找所有模糊模式的实例,你会在工作开始前就达到上下文窗口的限制。投资于代码库设置的团队会看到更好的结果。
工具箱与模型本身同等重要
关于 Claude Code 最常见的误解之一是其能力完全由所使用的模型决定。团队关注模型的基准及其在测试任务中的表现。实际上,围绕模型构建的生态系统——工具箱——比单独模型更能决定 Claude Code 的表现。
该工具箱由五个扩展点构成——CLAUDE.md 文件、钩子、技能、插件和 MCP 服务器——每个都具有不同的功能。团队构建它们的顺序很重要,因为每一层都建立在前一层的基础上。另外两个能力,LSP 集成和子代理,完善了整个设置。下面,我们解释这些组件和能力的用途:
CLAUDE.md文件是第一位的。这些是上下文文件,Claude 会在每次会话开始时自动读取:根文件提供全局概览,子目录文件提供局部约定。它们为 Claude 提供做好任何事情所需的代码库知识。由于它们会在每个会话中加载,无论任务如何,因此保持它们专注于广泛适用的内容将防止它们成为性能负担。
钩子让设置能够自我改进。大多数团队将钩子视为防止 Claude 做错事的脚本,但它们更有价值的用途是持续改进。停止钩子可以回顾会话期间发生的事情,并在上下文仍然新鲜时提出 CLAUDE.md 的更新建议。启动钩子可以动态加载团队特定的上下文,这样每位开发人员都能在不进行手动配置的情况下,为其模块获得正确的设置。对于 linting 和格式化等自动化检查,钩子会确定性地执行规则,产生的结果比依靠 Claude 记住指令更加一致。
技能在需要时按需保留正确的专业知识,而不会让每次会话变得臃肿。在拥有数十种任务类型的大型代码库中,并非所有专业知识都需要在每次会话中出现。技能通过渐进式披露来解决这个问题,将原本会争夺上下文空间的专业化工作流程和领域知识卸载,并且仅在任务需要时加载。例如,当 Claude 评估代码漏洞时加载安全审查技能,而当需要更新文档时则加载文档处理技能。
技能也可以限定到特定路径,这样它们只会在代码库的相关部分激活。负责支付服务的团队可以将其部署技能绑定到该目录,这样当单仓中其他位置的工作时,它就不会自动加载。
插件分发有效的内容。大型代码库的一个挑战在于,好的配置可能仍然停留在口头相传。插件将技能、钩子和MCP配置捆绑成一个可安装的包,因此当新工程师第一天安装该插件时,他们将立即拥有与已经使用Claude的人相同的上下文和能力。插件更新可以通过托管市场在组织内分发。
例如,我们合作的一家大型零售组织构建了一个技能,将Claude连接到他们的内部分析平台,以便业务分析师无需离开工作流程即可提取绩效数据。他们在向业务部门广泛推广之前,将其作为插件分发。
语言服务器协议(LSP)集成让Claude拥有开发者在IDE中相同的导航能力。大多数大型代码库的IDE已经运行了LSP,支持“转到定义”和“查找所有引用”。将这一点提供给Claude使其具有符号级别的精确性:它可以跟踪函数调用到其定义,跨文件追踪引用,并区分不同语言中同名函数。没有它,Claude会在文本上进行模式匹配,可能落在错误的符号上。我们合作的一家企业软件公司在推出Claude Code之前,全组织部署了LSP集成,专门用于确保C和C++导航在大规模下的可靠性。对于多语言代码库,这是价值最高的投资之一。
MCP服务器扩展了一切。MCP服务器是Claude连接到内部工具、数据源和API的方式,否则这些无法访问。最复杂的团队构建了MCP服务器,将结构化搜索作为工具暴露给Claude直接调用。其他人则将Claude连接到内部文档、工单系统或分析平台。
子代理将探索与编辑分离。子代理是一个独立的Claude实例,拥有自己的上下文窗口,它接收任务、执行工作,并仅将最终结果返回给父代理。一旦环境就绪,一些团队会启动一个只读子代理来映射子系统并将发现写入文件,然后让主代理在完整图景下进行编辑。

下表总结了每个组件的作用、加载时间以及我们看到的常见错误:
| 组件 | 它是什么 | 加载时间 | 最适合 | 常见混淆 |
|---|---|---|---|---|
| CLAUDE.md | Claude自动读取的上下文文件 | 每次会话 | 项目特定约定、代码库知识 | 将其用于应属于技能的可复用专业知识 |
| 钩子 | 在关键时刻运行的脚本 | 由事件触发 | 自动化一致行为、捕获会话学习 | 使用提示来做应该自动运行的事情 |
| 技能 | 针对特定任务类型的打包指令 | 按需,当相关时 | 跨会话和项目的可复用专业知识 | 将一切加载到CLAUDE.md中 |
| 插件 | 捆绑的技能、钩子、MCP配置 | 配置后始终可用 | 在组织内分发工作配置 | 让好的配置停留在口头相传 |
| 语言服务器协议(LSP)* | 通过语言特定服务器实现实时代码智能 | 配置后始终可用 | 符号级导航和类型语言中的自动错误检测 | 假设它是自动的 |
| MCP服务器 | 与外部工具和数据的连接 | 配置后始终可用 | 让Claude访问其无法访问的内部工具 | 在基础工作正常之前构建MCP连接 |
| 子代理* | 用于特定任务的独立Claude实例 | 被调用时 | 将探索与编辑分离、并行工作 | 在同一会话中运行探索和编辑 |
| *LSP通过插件层访问。子代理是一种委派能力,而不是配置的扩展点。 | ||||
成功部署中的三种配置模式
如何为大型代码库配置Claude Code在很大程度上取决于该代码库的结构。尽管如此,在我们观察的部署中,三种模式始终出现。
使代码库在大规模下可导航
Claude在大型代码库中提供帮助的能力受限于其找到正确上下文的能力。每个会话加载过多上下文会降低性能,而上下文过少则导致Claude盲目导航。最有效的部署会提前投资,使代码库对Claude清晰可读。有几个模式始终出现:
- 保持CLAUDE.md文件精简且分层。Claude在代码库中移动时增量加载它们:根文件用于大局观,子目录文件用于局部约定。根文件应该只包含指针和关键注意事项;其他一切都会变成噪音。
- 在子目录中初始化,而不是仓库根目录。当Claude的范围限定在与任务实际相关的代码库部分时,它表现最佳。在单体仓库中,这可能会感觉违反直觉,因为工具通常假定根访问,但Claude会自动向上遍历目录树并加载沿途找到的每个CLAUDE.md文件,因此根级上下文永远不会丢失。
- 按子目录限定测试和lint命令的范围。当Claude更改了一个服务时运行完整测试套件会导致超时,并在不相关的输出上浪费上下文。子目录级别的CLAUDE.md文件应指定适用于该部分代码库的命令。这对于面向服务的代码库很有效,其中每个目录都有自己的测试和构建命令。在具有深层跨目录依赖的编译语言单体仓库中,按子目录限定范围更难实现,可能需要项目特定的构建配置。
- 使用
。ignore文件排除生成文件、构建产物和第三方代码。提交permissions.deny规则到.claude/settings.json意味着排除规则是版本控制的,所以团队中的每个开发者都能获得相同的噪音减少,而不必自行配置。在某些代码库中,生成文件本身就是开发工作的主题。从事代码生成器开发的开发者可以在本地设置中覆盖项目级别的排除规则,而不会影响团队的其他成员。 - 在目录结构不能提供帮助的情况下构建代码库地图。对于代码未按传统目录结构整合的组织,在仓库根目录放置一个轻量级的 markdown 文件,列出每个顶级文件夹并附上一行描述说明其中内容,这样可以为 Claude 提供一个目录,在打开文件之前进行扫描。对于拥有数百个顶级文件夹的代码库,这种方法最适合采用分层方式:根文件仅描述最顶层的结构,而子目录中的 CLAUDE.md 文件提供下一级的细节,并在 Claude 遍历树时按需加载。对于更简单的情况,@提及 Claude 应参考的特定文件或目录可以起到相同作用。
- 运行 LSP 服务器,让 Claude 按符号而非字符串进行搜索。在大型代码库中使用 grep 搜索常见函数名会返回数千个匹配项,Claude 会浪费上下文打开文件来确定哪些是重要的。LSP 只返回指向同一符号的引用,因此过滤发生在 Claude 读取任何内容之前。 设置此功能需要安装代码智能插件针对你的语言以及对应的语言服务器二进制文件;Claude Code 文档涵盖了可用的插件和故障排除方法。
一个注意事项:在某些边缘情况下,即使分层 CLAUDE.md 方法也会失效,例如拥有数十万个文件夹和数百万个文件的代码库,或使用非 git 版本控制的遗留系统。我们将在本系列的后续部分中解决这些挑战。对于遗留系统,请参阅 AI 如何打破 COBOL 现代化的成本障碍。
随着模型智能的演进,主动维护 CLAUDE.md 文件
随着模型的演进,为当前模型编写的指令可能对未来的模型产生不利影响。指导 Claude 解决过去难以处理的模式的 CLAUDE.md 文件,在下一个模型发布时可能会变得不必要,甚至成为约束。例如,一条 CLAUDE.md 规则告诉 Claude 将每次重构分解为单文件更改,这可能帮助了早期模型保持正轨,但会阻止更新的模型进行它擅长处理的协调的多文件编辑。
为补偿特定模型限制而构建的技能和钩子,无论是在模型的推理能力还是 Claude Code 自身的工具中,一旦这些限制不再存在,就会变成开销。例如,一个拦截文件写入以在 Perforce 代码库中强制执行 p4 edit 的钩子,在 Claude Code 添加原生 Perforce 模式后变得多余。
团队应预期每三到六个月进行一次有意义的配置审查,但在重大模型发布后感觉性能停滞时也值得进行一次。
为 Claude Code 管理和采用分配所有权
仅技术配置并不能推动采用。做得好的组织也投资了组织层面。
传播最快的推广在广泛访问之前有专门的基础设施投资。一个小团队,有时甚至一个人,预先配置好工具,使 Claude 在开发者首次接触时就已适配他们的工作流。在一家公司,几个工程师构建了一套插件和 MCP,第一天就可用。在另一家公司,一个专注于管理 AI 编码工具的整个团队在推广开始前就准备好了基础设施。在这两种情况下,开发者的首次体验是富有成效的而不是令人沮丧的,采用从那时起传播开来。

今天从事这项工作的团队通常隶属于开发者体验或开发者生产力部门,这通常是负责入职新工程师和构建开发者工具的功能。在几个组织中,一个新兴角色是代理经理:一个混合 PM/工程师职能,专门负责管理 Claude Code 生态系统。对于没有专门团队的组织,最低可行版本是 DRI:一个人拥有 Claude Code 配置的所有权,有权决定设置、权限策略、插件市场和 CLAUDE.md 约定,并负责保持它们的最新状态。
自下而上的采用能激发热情,但如果没有专人集中整合有效实践,就会碎片化。你需要一个人或一个团队来整合和推广正确的 Claude Code 约定(例如标准化的 CLAUDE.md 层级结构或精选的技能和插件集)。没有这项工作,知识将停留在部落化层面,采用将停滞不前。
在大型组织中,尤其是在受监管行业,治理问题很早就出现,例如:谁控制哪些技能和插件可用,如何防止成千上万的工程师独立重建相同的东西,如何确保 AI 生成的代码经历与人类生成的代码相同的审查过程?为了及早解决这些问题,我们建议从一组明确的已批准技能、必需的代码审查流程和有限的初始访问开始,并随着信心的增强而扩大。
我们观察到,在那些早期建立跨职能工作组,将工程、信息安全、治理代表聚集在一起共同定义需求并制定推广路线图的组织中,部署最顺利。
将这些模式应用到你的组织
Claude Code 是围绕传统软件工程环境设计的,在这些环境中,工程师是代码库的主要贡献者,仓库使用 Git,代码遵循标准目录结构。大多数大型代码库符合这种模式,但非传统设置,如带有大型二进制资产的游戏引擎、具有非常规版本控制的环境,或非工程师参与代码库贡献,都需要额外的配置工作。我们的指导假设是传统设置,我们描述的模式已在许多客户中得到验证。任何剩余的复杂性都需要针对你的代码库、工具和组织进行具体判断。这就是 Anthropic 的应用 AI 团队直接与工程团队合作,将这些模式转化为你组织的具体需求的地方。

开始使用 Claude Code 企业版。
致谢: 特别感谢 Anthropic 应用 AI 团队的 Alon Krifcher、Charmaine Lee、Chris Concannon、Harsh Patel、Henrique Savelli、Jason Schwartz、Jonah Dueck 和 Kirby Kohlmorgen 分享他们大规模部署 Claude Code 的经验,以及 Zoox 的 Amit Navindgi 对本文提供反馈。
这篇内容对你有用吗?
反馈只用于改善内容筛选,不等同于收藏