Memory 导入处理器
Memory 导入处理器是一个允许您通过使用 @file.md
语法从其他 markdown 文件导入内容来模块化您的 GEMINI.md 文件的功能。
概述
此功能使您能够将大型 GEMINI.md 文件分解为更小、更易管理的组件,这些组件可以在不同上下文中重复使用。导入处理器支持相对路径和绝对路径,具有内置安全功能以防止循环导入并确保文件访问安全。
重要限制
此功能仅支持 .md
(markdown)文件。 尝试导入其他扩展名的文件(如 .txt
、.json
等)将导致警告,导入将失败。
语法
使用 @
符号后跟您要导入的 markdown 文件的路径:
markdown
# 主 GEMINI.md 文件
这是主要内容。
@./components/instructions.md
更多内容在这里。
@./shared/configuration.md
支持的路径格式
相对路径
@./file.md
- 从同一目录导入@../file.md
- 从父目录导入@./components/file.md
- 从子目录导入
绝对路径
@/absolute/path/to/file.md
- 使用绝对路径导入
示例
基本导入
markdown
# 我的 GEMINI.md
欢迎来到我的项目!
@./getting-started.md
## 功能
@./features/overview.md
嵌套导入
导入的文件本身可以包含导入,创建嵌套结构:
markdown
# main.md
@./header.md
@./content.md
@./footer.md
markdown
# header.md
# 项目标题
@./shared/title.md
安全功能
循环导入检测
处理器自动检测并防止循环导入:
markdown
# file-a.md
@./file-b.md
# file-b.md
@./file-a.md # 这将被检测并阻止
文件访问安全
validateImportPath
函数确保只允许从指定目录导入,防止访问允许范围外的敏感文件。
最大导入深度
为防止无限递归,有一个可配置的最大导入深度(默认:10 级)。
错误处理
非 MD 文件尝试
如果您尝试导入非 markdown 文件,您将看到警告:
markdown
@./instructions.txt # 这将显示警告并失败
控制台输出:
[WARN] [ImportProcessor] Import processor only supports .md files. Attempting to import non-md file: ./instructions.txt. This will fail.
缺少文件
如果引用的文件不存在,导入将优雅地失败,并在输出中添加错误注释。
文件访问错误
权限问题或其他文件系统错误会通过适当的错误消息优雅地处理。
API 参考
processImports(content, basePath, debugMode?, importState?)
处理 GEMINI.md 内容中的导入语句。
参数:
content
(string):要处理导入的内容basePath
(string):当前文件所在的目录路径debugMode
(boolean, 可选):是否启用调试日志记录(默认:false)importState
(ImportState, 可选):用于循环导入防护的状态跟踪
返回: Promise<string>
- 已解析导入的处理内容
validateImportPath(importPath, basePath, allowedDirectories)
验证导入路径以确保它们是安全的且在允许的目录内。
参数:
importPath
(string):要验证的导入路径basePath
(string):用于解析相对路径的基础目录allowedDirectories
(string[]):允许的目录路径数组
返回: boolean - 导入路径是否有效
最佳实践
- 为导入组件使用描述性文件名
- 保持导入浅层 - 避免深层嵌套的导入链
- 记录您的结构 - 维护导入文件的清晰层次结构
- 测试您的导入 - 确保所有引用的文件存在且可访问
- 尽可能使用相对路径 以获得更好的可移植性
故障排除
常见问题
- 导入不工作:检查文件是否存在且具有
.md
扩展名 - 循环导入警告:检查您的导入结构是否存在循环引用
- 权限错误:确保文件可读且在允许的目录内
- 路径解析问题:如果相对路径无法解析,请使用绝对路径
调试模式
启用调试模式以查看导入过程的详细日志记录:
typescript
const result = await processImports(content, basePath, true);