結論:RedoclyでOpenAPI Specをタグで分割できる
Redocly CLIのfilter-in/filter-outデコレーターを使えば、1つのOpenAPI定義を複数のドキュメントに分割できる。
公開API用と管理API用でSwagger UIを分けたい場合など、タグベースでAPI仕様を分離できる。
背景:なぜ分割が必要か
単一のGo APIで複数のクライアント向けにエンドポイントを提供する場合、全エンドポイントを1つのSwagger UIに表示すると見づらい。
例:
- 公開API: ユーザー機能、コンテンツ表示
- 管理API: データ管理、レポート取得、設定変更
→ それぞれ専用のSwagger UIを生成したい
解決方法:Redocly CLI + filter デコレーター
1. swagでOpenAPI定義を生成
swag:
@echo "==> Running swag init" >&2
@swag init -g cmd/your-api/main.go -o docs
@npx -y @redocly/cli@latest bundle docs/swagger.yaml --config docs/redocly-public.yaml -o docs/swagger_public.yaml
@npx -y @redocly/cli@latest bundle docs/swagger.yaml --config docs/redocly-admin.yaml -o docs/swagger_admin.yaml && \
sed -i -e 's,API for Public,API for Admin,g' docs/swagger_admin.yaml
2. 公開API用設定:管理タグを除外
docs/redocly-public.yaml:
decorators:
filter-out:
property: tags
value: [admin]
matchStrategy: anyfilter-out: adminタグが付いたエンドポイントを除外 → 公開API向けのみ残る
3. 管理API用設定:管理タグのみ含める
docs/redocly-admin.yaml:
decorators:
filter-in:
property: tags
value: [admin]
matchStrategy: anyfilter-in: adminタグが付いたエンドポイントのみ含める → 管理API向けのみ残る
デコレーターの動作
| デコレーター | 動作 | 用途 |
|---|---|---|
| filter-in | 指定タグがあるエンドポイントのみ残す | 特定クライアント専用API |
| filter-out | 指定タグがないエンドポイントのみ残す | 特定クライアント向け除外 |
matchStrategy: any: 複数タグのいずれか1つでもマッチすればフィルタリング対象
Goコードでのタグ付け
// 公開APIエンドポイント(タグなし or public)
// @Tags user
// @Router /api/users [get]
func GetUsers(c *gin.Context) { ... }
// 管理APIエンドポイント(adminタグ)
// @Tags admin
// @Router /api/admin/reports [get]
func GetReports(c *gin.Context) { ... }まとめ
- Redocly CLIでOpenAPI Specをタグで分割できる
filter-in: 指定タグのみ含めるfilter-out: 指定タグを除外- swag + Redoclyの組み合わせでクライアント別Swagger UIを生成
- 1つのコードベースから複数のAPI仕様ドキュメントを管理可能
