hubmodule
集中定义和实现 Any-Hub 的“代理 + 缓存”模块体系。
目录结构
internal/hubmodule/
├── doc.go # 包级说明与约束
├── README.md # 本文件
├── registry.go # 模块注册/发现入口(后续任务)
└── <module-key>/ # 各仓类型模块,例如 legacy、npm、docker
模块约束
- 单一接口:每个模块需要同时实现代理与缓存接口,避免跨包耦合。
- 注册流程:在模块
init()中调用hubmodule.Register(ModuleMetadata{...}),注册失败必须 panic 以阻止启动。 - 缓存布局:一律使用
StoragePath/<Hub>/<path>,即与上游请求完全一致的磁盘路径;当某个路径既要保存正文又要作为子目录父节点时,会在该目录下写入__content文件以存放正文。 - 配置注入:模块仅通过依赖注入获取
HubConfigEntry和全局参数,禁止直接读取文件或环境变量。 - 可观测性:所有模块必须输出
module_key、命中/回源状态等日志字段,并在返回错误时附带 Hub 名称。
开发流程
- 复制
internal/hubmodule/template/(由 T010 提供)作为起点。 - 填写模块特有逻辑与缓存策略,并确保包含中文注释解释设计。
- 在模块目录添加
module_test.go,使用httptest.Server与t.TempDir()复现真实流量。 - 运行
make modules-test验证模块单元测试。 [[Hub]].Type现已直接映射到同名模块;新增模块时记得将类型加入配置校验与示例配置。
术语
- Module Key:模块唯一标识(如
legacy、npm-tarball)。 - Cache Strategy Profile:定义 TTL、验证策略、磁盘布局等策略元数据。
- Legacy Adapter:包装当前共享实现,确保迁移期间仍可运行。