拒绝文档陷阱!用调试器啃下 Google ToolBox 数据库工具箱源码

0. 前言

阅读源码是提升自己和快速获取某个知识的很不错的方式,如何高效的阅读源码每个程序员可能都有自己不同的见解,这里我就简单介绍下我是如何阅读源码的:

  • 先读readme,一般来说readme中会写到项目启动的命令,以及项目依赖的包、示例代码和一些faqs等;
  • 有些大型公司或者组织维护的开源项目一般还会有详细的文档,如果项目是非稳定版本的话,这些文档存在过时的可能,会误导你,所以对于暂时不是稳定版本的项目,可以先不看文档,等稳定版本发布之后再看文档。
  • 本地调试,通过自上而下的方式,从对外暴露的api到内部实现,或者从某个命令到其执行方法。

这里我以go语言项目为例说明下,go项目通常有两种,一种是cli工具,一种是web服务,对于cli工具,本地调试的话主要关注xxx(cmd *Command),通常该方法对于者该命令要执行的逻辑,对于web服务,本地调试的话主要关注router,通常该方法对于web服务对外暴露api的逻辑。


1. 实战

这里我们以Genai-ToolBox项目为例,带你一起实战下。Genai-ToolBoxREADME文档上详细的说明了为什么开发该项目、该项目的架构、如何本地安装、如何对接不同语言的AI框架、以及核心模块的介绍,可以说是很详细了。

那通过README文档我们就初步了解该项目是一个sse通信的MCP Server项目,具备提供数据库tools、安全认证、监听文件变更的能力,通过提供不同语言的sdk来快速的集成本项目。

由于该项目是beta版本,就先不看详细文档了,直接开始本地调试来阅读源码,理解其主要功能。


1.1 配置launch文件

由于我平常开发使用的是vscode,所以这里就用配置launch文件的方式来介绍如何本地调试。

这一步是最重要的,因为它关系到服务能不能正常运行。 下面就说下如何配置ToolBoxlaunch文件:

git clone 拉取项目到本地,在main.go中通过Execute方法跳转到命令行文件中,查看命令行中各个命令的参数,以及各个命令的逻辑。这通常关系着launch文件的配置。 下图展示了该项目定义的多个命令,但是和调试最相关的就是tools-fileprebuilt相关的命令,但是命令行中有说明它两不能共存。

有了这个信息就可以将代码跳转到prebuilt的执行处,看它两互斥逻辑做了什么处理,如图可以看到如果使用了prebuilt命令就不需要定义一份或多份tools.yaml文件了,直接可以用项目中定义的文件即可。

ok,那我们可以先新建一个launch文件,配置下prebuilt命令,启动项目看下有什么效果。不出意外,服务启动失败。

原因就是没有配置pgsql的环境变量导致初始化pg资源失败了,那么我们在启动文件上加上pg的环境变量即可,如下所示:

1.2 集成 go sdk 调试

上面我们通过debug模式本地启动了项目,接下来就可以调试了。在开始前,我一般喜欢带着几个问题去调试,通过调试理解掌握了这些问题,也就达到了我阅读源码的目的;通常这些问题是README文档中所描述的功能,比如本项目,我们可以看下ToolBox是如何对外提供tools的、如何做安全认证的、如何动态监听文件变化的等等。


好了接下来通过ToolBox提供的go sdk来调试下,看下其如何对外提供tools。这里我们新建一个vscode项目,原先通过debug模式启动的ToolBox项目保持启动状态,我们通过外接ToolBox项目的新工程来调试ToolBox。下图所示是README中提到的示例代码,启动后即可在本地连接ToolBox

图中toolset是在pgsql的预构建的yaml文件中获取的,通过进入LoadToolset方法,即可看到调用了ToolBox/toolset/%s接口,切换ToolBox,搜索/toolset即可找到router相关的代码;再次执行demo 服务,即可通过断点调试ToolBox对外提供的api接口了。

1.3 通过 MCP Inspector 调试

由于ToolBox项目是MCP Server,所以也可以通过 MCP Inspector来调试,不熟悉 MCP Inspector的同学可以参考我之前写的浅谈 MCP Inspector

bash 复制代码
npx @modelcontextprotocol/inspector

通过执行上面的命令启动inspector,然后配置sse连接即可。

2. 小结

以上就我是如何阅读源码的方式,可以简化为:

  • 读取README.md
  • 阅读doc
  • 本地启动
  • 本地调试
  • 理解README文档中所描述的主要功能的实现方式。

希望对大家有用,如果大家有更好的方式,欢迎在评论区交流。

相关推荐
汪子熙7 分钟前
计算机世界里的 blob:从数据库 BLOB 到 Git、Web API 与云存储的二进制宇宙
后端
鞋尖的灰尘25 分钟前
springboot-事务
java·后端
元元的飞28 分钟前
6、Spring AI Alibaba MCP结合Nacos自动注册与发现
后端·ai编程
Cisyam29 分钟前
Go环境搭建实战:告别Java环境配置的复杂
后端
六月的雨在掘金36 分钟前
狼人杀法官版,EdgeOne 带你轻松上手狼人杀
前端·后端
绝无仅有42 分钟前
使用 Docker、Jenkins、Harbor 和 GitLab 构建 CI/CD 流水线
后端·面试·github
张同学的IT技术日记1 小时前
必看!用示例代码学 C++ 继承,快速掌握基础知识,高效提升编程能力
后端
杨杨杨大侠1 小时前
10 - 性能优化和扩展 🚀
后端·开源·workflow
前端老鹰1 小时前
Node.js 网页解析神器:cheerio 模块实战指南,像 jQuery 一样玩转 HTML
后端·node.js