第三章. Gemini Cil Memport:模块化的上下文管理
第三章. Gemini Cil Memport:模块化的上下文管理
Prorise第三章. Gemini Cil Memport:模块化的上下文管理
本章将深入讲解 Gemini CLI 的 Memport 机制,这是一个让项目上下文管理变得模块化、可维护的核心功能。学完本章,你将能够构建清晰的上下文架构,让 AI 更准确地理解你的项目规范。
3.1. 为什么需要 Memport
如果你用过 Claude Code,应该对 CLAUDE.md 这个文件不陌生。这是 Claude Code 用来存储项目上下文的地方,你可以在里面写项目规范、编码风格、常用命令等信息,Claude 会在每次对话时读取这些内容。
但问题来了:当项目变大、团队成员增多时,CLAUDE.md 很容易膨胀到几千行。我见过最夸张的一个项目,CLAUDE.md 有 5000 多行,包含了 API 文档、数据库表结构、前端组件规范、部署流程等等。维护起来非常痛苦,而且它是单文件结构,无法模块化,多人协作时经常出现版本冲突。
Gemini CLI 用Memory Import Processor上下文导入处理器,允许模块化组织项目上下文解决了这个问题。Memport 允许你用 @./file.md 语法在 GEMINI.md 中导入其他文件,就像 ES6 模块那样组织上下文。
一个真实的痛点场景
假设你在开发一个电商系统,项目上下文包含:
- 团队编码规范(200 行)
- API 接口定义(800 行)
- 数据库表结构(500 行)
- 前端组件库规范(300 行)
- 部署流程(150 行)
如果全部塞进一个 GEMINI.md,这个文件会有 1950 行。当你只想修改 API 接口定义时,需要在这 1950 行中找到对应的位置,非常低效。而且如果两个人同时修改不同的部分,Git 合并时会很麻烦。
用 Memport,你可以这样组织:
1 | .gemini\ |
主 GEMINI.md 只需要 5 行:
1 | # 电商系统项目上下文 |
这样,每个文件职责清晰,修改时不会互相干扰。
3.2. Memport 的基础语法
Memport 的语法非常简单,就是在 Markdown 文件中使用 @ 符号引用其他文件。
基础导入
在 .gemini\GEMINI.md 中写入:
1 | @.\context\api-schema.md |
Gemini CLI 启动时,会自动读取 context\api-schema.md 的内容,并将其注入到上下文中。
相对路径规则
Memport 支持多种路径格式:
| 路径格式 | 含义 | 示例 |
|---|---|---|
@.\file.md | 当前目录 | @.\api.md |
@..\file.md | 父目录 | @..\shared\utils.md |
@.\sub\file.md | 子目录 | @.\context\api.md |
@\absolute\path\file.md | 绝对路径 | @D:\docs\api.md |
Windows 路径中的反斜杠 \ 在 Markdown 中不需要转义。直接写 @.\context\api.md 即可。
嵌套导入
被导入的文件本身也可以包含导入语句,形成嵌套结构。
比如 team-conventions.md 中可以写:
1 | # 团队编码规范 |
然后在主 GEMINI.md 中只需要:
1 | @.\context\team-conventions.md |
Gemini CLI 会递归解析所有导入,最终形成一个完整的上下文树。
3.3. 安全机制:防止循环引用
Memport 内置了三层安全机制,防止你把自己绕晕。
机制 1:循环引用检测
假设你不小心写了这样的配置:
file-a.md:
1 | @.\file-b.md |
file-b.md:
1 | @.\file-a.md |
这就形成了循环引用。Gemini CLI 会在解析阶段检测到这个问题,并报错:
1 | Error: Circular import detected |
CLI 会立即中断启动,不会陷入死循环。
机制 2:最大导入深度
Memport 限制了最大导入深度,默认是 5 层。这意味着你不能无限嵌套导入。
比如这样的结构是允许的:
1 | GEMINI.md |
但如果 level5.md 再导入 level6.md,就会报错:
1 | Error: Maximum import depth (5) exceeded |
为什么要限制深度?因为过于复杂的嵌套结构会让 AI 迷失。AI 需要理解上下文的层次关系,如果嵌套太深,AI 可能会混淆不同层级的信息。
机制 3:路径验证
Memport 会验证导入的文件路径是否合法。有两个检查点:
- 文件是否存在:如果引用的文件不存在,会报错并显示完整路径。
- 路径是否越权:Memport 会确保导入的文件在项目根目录及以下,防止越权读取系统文件。
比如你写了:
1 | @..\..\..\..\Windows\System32\config\sam |
Gemini CLI 会拒绝这个导入,并报错:
1 | Error: Import path outside project root is not allowed |
这是一个安全保护机制,防止恶意或错误的配置泄露敏感信息。
3.4. 三层上下文加载机制
Gemini CLI 启动时会按顺序加载三层上下文,每一层都有不同的作用域和优先级。
第一层:全局上下文
位置:C:\Users\你的用户名\.gemini\GEMINI.md
这是用户级的全局配置,适用于所有项目。你可以在这里写一些通用的偏好设置。
比如我的全局 GEMINI.md 是这样的:
1 | ## 代码质量标准 |
这些规则会应用到我所有的项目中。
第二层:项目上下文
位置:项目根目录\.gemini\GEMINI.md
这是项目级的配置,只适用于当前项目。你可以在这里写项目特定的规范。
比如一个 React 项目的 GEMINI.md:
1 | # 电商前端项目 |
第三层:本地上下文
位置:当前工作目录\GEMINI.md
这是最细粒度的上下文,只适用于当前子目录。适合用于特定模块的说明。
比如在 src\payment\ 目录下创建 GEMINI.md:
1 | # 支付模块 |
上下文合并规则
这三层上下文会按顺序合并,后加载的内容会覆盖先加载的内容。
假设全局上下文说:“使用 any 类型是允许的”,但项目上下文说:“禁止使用 any 类型”,那么最终 AI 会遵循项目上下文的规则。
合并顺序:
1 | 全局上下文 (优先级最低) |
这种设计让你可以在全局设置通用规则,在项目中设置项目特定规则,在子模块中设置模块特定规则,灵活且不冲突。
3.5. 本节小结
我们在本节学习了 Memport 的模块化上下文管理机制。核心要点:
Memport 的三大优势:
- 模块化:将大文件拆分成多个小文件,职责清晰
- 可维护:修改某个模块不影响其他模块
- 可复用:通用规范可以在多个项目间共享
三层上下文加载:
| 层级 | 位置 | 作用域 | 优先级 |
|---|---|---|---|
| 全局 | ~\.gemini\GEMINI.md | 所有项目 | 低 |
| 项目 | 项目根\.gemini\GEMINI.md | 当前项目 | 中 |
| 本地 | 当前目录\GEMINI.md | 当前目录 | 高 |
安全机制:
- 循环引用检测
- 最大深度限制(5 层)
- 路径越权保护
速查代码:
1 | # 主 GEMINI.md |
下一节,我们将学习 MCP 集成,了解如何通过 Model Context Protocol 扩展 Gemini CLI 的能力边界。



