Files
any-hub/specs/001-config-bootstrap/research.md
2025-11-14 12:11:44 +08:00

2.8 KiB
Raw Blame History

Research: 配置与骨架

配置加载与校验

  • Decision: 使用 Viper 读取单一 config.toml,解析到 GlobalConfig + []HubConfig 结构,先合并默认值再执行字段级校验(必填、范围、路径可写),校验失败即返回结构化错误并阻断启动。
  • Rationale: 单一入口与结构化错误能满足宪法“单一控制平面 + 阻断非法配置”的要求,也方便 --check-config 模式直接复用相同逻辑。
  • Alternatives considered: 直接手写 encoding/toml 解析(缺乏灵活默认/环境覆盖),多文件拆分(违反宪法单一配置要求)。

CLI 标志与执行模式

  • Decision: 使用 pflag/flag 解析 --config, --check-config, --version,解析顺序:标志 > ANY_HUB_CONFIG 环境变量 > 默认路径;--check-config 触发只读模式,--version 输出后立即退出。
  • Rationale: 可预测的优先级防止多来源冲突;独立模式让 CI 可执行校验并快速确认版本,贴合用户故事 1/2。
  • Alternatives considered: 将 --check-config 拆成单独子命令(增加学习成本)、允许多配置文件(违背宪法)。

日志初始化策略

  • Decision: 统一在 CLI 启动与校验路径调用 initLogger(cfg),基于 Logrus + Lumberjack默认 stdout若配置文件路径可写则启用滚动文件同时注入字段hub、domain、action、configPath、result
  • Rationale: 结构化日志 + 滚动文件满足宪法可观测性;单初始化路径减少重复配置并确保 --check-config 也有可追踪日志。
  • Alternatives considered: log/slog失去与现有宪法保持一致的依赖多 logger 实例(复杂度高且容易导致字段缺失)。

测试与验证覆盖

  • Decision: 编写 internal/config 单元测试覆盖:必填字段缺失、类型错误、默认值填充、[[Hub]] 唯一约束CLI 集成测试使用 httptest/临时目录模拟不同标志组合;日志初始化通过接口注入 writer 以断言字段。
  • Rationale: 完成宪法要求的配置/缓存/路由主路径测试,确保 Phase 0 可在 go test ./... 下复现;临时目录避免污染本地环境。
  • Alternatives considered: 仅手动测试(无法满足 Gate、依赖真实文件系统路径降低可靠性

依赖与最佳实践

  • Decision: 保持依赖集为 Go 标准库 + Viper + Logrus + Lumberjack + pflag随 Viper 引入),不新增网络/数据库库;使用 fsnotify 仅作为 Viper 间接依赖,不启用热加载。
  • Rationale: 满足宪法“受控依赖”原则并保持二进制小巧;禁用热加载可降低错配风险并符合单一配置理念。
  • Alternatives considered: 引入 Cobra CLI依赖过重且 Phase 0 命令简单)、使用 zap 日志(与既定依赖不符)。