Files
huang 6fc90abeb6 实现服务启动时自动生成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>
2026-01-09 12:25:50 +08:00

3.4 KiB
Raw Permalink Blame History

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

实现概述

本次实现在服务启动时自动生成 OpenAPI 文档,确保文档与运行的服务保持同步。

核心变更

1. 新增文件

cmd/api/docs.go

创建了 generateOpenAPIDocs() 函数,负责在服务启动时自动生成 OpenAPI 文档。

关键实现:

  • 创建临时 Fiber App 用于路由注册
  • 使用 nil 依赖创建 Handler仅需路由结构
  • 调用路由注册函数填充文档生成器
  • 保存文档到指定路径
  • 生成失败时记录错误但不中断服务启动

2. 修改文件

cmd/api/main.go

在主函数的步骤 11 添加了文档生成调用:

// 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/openapiinternal/routespkg/openapi

解决方案: 将生成逻辑放在各自的 cmd/ 包内:

  • cmd/api/docs.go - 服务启动时的生成逻辑
  • cmd/gendocs/main.go - 独立工具的生成逻辑

这样做的好处:

  • 避免了循环依赖
  • 保持了包的职责清晰
  • 代码简单直接,易于维护

优雅的错误处理

文档生成失败不应影响服务启动:

  • 生成失败时使用 appLogger.Error() 记录错误
  • 服务继续启动,保证可用性
  • 开发者可以通过日志发现问题

文档输出路径

  • 服务启动生成: ./openapi.yaml(项目根目录)
  • 独立工具生成: ./docs/admin-openapi.yaml(保持原有行为)

测试验证

编译测试

go build -o /tmp/test-api ./cmd/api
go build -o /tmp/test-gendocs ./cmd/gendocs

编译成功,无错误

功能测试

/tmp/test-gendocs

输出:

2026/01/09 12:11:57 成功在以下位置生成 OpenAPI 文档: /Users/break/csxjProject/junhong_cmp_fiber/docs/admin-openapi.yaml

文档生成成功33KB

代码规范检查

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. 考虑添加启动参数控制是否生成文档(如需要)