# 实现总结:服务启动时自动生成OpenAPI文档 ## 实现概述 本次实现在服务启动时自动生成 OpenAPI 文档,确保文档与运行的服务保持同步。 ## 核心变更 ### 1. 新增文件 #### `cmd/api/docs.go` 创建了 `generateOpenAPIDocs()` 函数,负责在服务启动时自动生成 OpenAPI 文档。 **关键实现**: - 创建临时 Fiber App 用于路由注册 - 使用 nil 依赖创建 Handler(仅需路由结构) - 调用路由注册函数填充文档生成器 - 保存文档到指定路径 - 生成失败时记录错误但不中断服务启动 ### 2. 修改文件 #### `cmd/api/main.go` 在主函数的步骤 11 添加了文档生成调用: ```go // 11. 生成 OpenAPI 文档 generateOpenAPIDocs("./openapi.yaml", appLogger) ``` **位置选择**: - 放在路由注册之后,确保有完整的路由信息 - 放在服务器启动之前,确保文档在服务可用前生成 #### `cmd/gendocs/main.go` 重构了独立文档生成工具: - 提取了 `generateAdminDocs()` 函数 - 主函数现在只负责调用生成函数和输出结果 - 保持原有的输出路径 `./docs/admin-openapi.yaml` - 返回错误而非 panic,便于错误处理 #### `.gitignore` 添加了自动生成的文档到忽略列表: ``` # Auto-generated OpenAPI documentation /openapi.yaml ``` ## 设计决策 ### 避免循环依赖 最初计划将生成逻辑放在 `pkg/openapi/generate.go`,但这会导致循环依赖: - `pkg/openapi` → `internal/routes` → `pkg/openapi` **解决方案**: 将生成逻辑放在各自的 `cmd/` 包内: - `cmd/api/docs.go` - 服务启动时的生成逻辑 - `cmd/gendocs/main.go` - 独立工具的生成逻辑 这样做的好处: - 避免了循环依赖 - 保持了包的职责清晰 - 代码简单直接,易于维护 ### 优雅的错误处理 文档生成失败不应影响服务启动: - 生成失败时使用 `appLogger.Error()` 记录错误 - 服务继续启动,保证可用性 - 开发者可以通过日志发现问题 ### 文档输出路径 - 服务启动生成: `./openapi.yaml`(项目根目录) - 独立工具生成: `./docs/admin-openapi.yaml`(保持原有行为) ## 测试验证 ### 编译测试 ```bash go build -o /tmp/test-api ./cmd/api go build -o /tmp/test-gendocs ./cmd/gendocs ``` ✅ 编译成功,无错误 ### 功能测试 ```bash /tmp/test-gendocs ``` 输出: ``` 2026/01/09 12:11:57 成功在以下位置生成 OpenAPI 文档: /Users/break/csxjProject/junhong_cmp_fiber/docs/admin-openapi.yaml ``` ✅ 文档生成成功(33KB) ### 代码规范检查 ```bash gofmt -l cmd/api/docs.go cmd/api/main.go cmd/gendocs/main.go go vet ./cmd/api/... ./cmd/gendocs/... ``` ✅ 所有检查通过 ## 影响范围 ### 新增功能 - ✅ 服务启动时自动生成 OpenAPI 文档 - ✅ 文档自动保存到项目根目录 `./openapi.yaml` - ✅ 生成失败时记录错误但不影响服务启动 ### 现有功能 - ✅ `cmd/gendocs` 工具继续可用(代码已重构但功能不变) - ✅ `make docs` 命令(如存在)继续可用 - ✅ 无破坏性变更 ### 开发体验改进 - ✅ 部署时无需手动执行 `make docs` - ✅ 文档始终与当前运行的服务保持同步 - ✅ 开发过程中自动更新文档,无需频繁手动执行命令 ## 后续工作 以下任务可以在后续完成: 1. 更新 README.md,说明自动生成功能 2. 添加文档生成的单元测试(如需要) 3. 考虑添加启动参数控制是否生成文档(如需要)