实现服务启动时自动生成OpenAPI文档

主要变更:
1. 新增 cmd/api/docs.go 实现文档自动生成逻辑
2. 修改 cmd/api/main.go 在服务启动时调用文档生成
3. 重构 cmd/gendocs/main.go 提取生成函数
4. 更新 .gitignore 忽略自动生成的 openapi.yaml
5. 新增 Makefile 支持 make docs 命令
6. OpenSpec 框架更新和变更归档

功能特性:
- 服务启动时自动生成 OpenAPI 文档到项目根目录
- 保留独立的文档生成工具 (make docs)
- 生成失败时记录错误但不影响服务启动
- 所有代码已通过 openspec validate --strict 验证

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
This commit is contained in:
2026-01-09 12:25:50 +08:00
parent ddbc69135d
commit 6fc90abeb6
47 changed files with 1095 additions and 5519 deletions

View File

@@ -0,0 +1,121 @@
# 实现总结服务启动时自动生成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. 考虑添加启动参数控制是否生成文档(如需要)