1
2

OpenAPI3.0 から Go のAPIクライアントコードを生成するライブラリ選定

Last updated at Posted at 2024-08-19

結論

oapi-codegen/oapi-codegenogen-go/ogen がよさげ。

1ファイルのみの生成でミニマムにやりたいなら oapi-codegen/oapi-codegen、リクエストのクライアント検証や optional 型、gRPC っぽいインタフェースで扱いたいなら ogen-go/ogen っていう所感。

要件

必須

  • OpenAPI3.0に対応していること
  • GoのAPIクライアントコードを生成できること

推奨(=選定観点)

  • ①ライブラリとして信頼できること
  • ②生成に要す時間が短いこと
  • ③生成コードが必要最低限であること

候補

OpenAPITools/openapi-generator

①ライブラリとして信頼できること :thumbsup:

  • スター数は21k
  • 1〜2ヶ月に一度はバージョンアップデートされ定期的にメンテナンスされている (ただし、さまざまな言語の更新を含む)

②生成に要す時間が短いこと :thumbsup:
計測していないが1秒以内だった

❯ docker run -v ${PWD}:/local openapitools/openapi-generator-cli:v7.7.0 generate -i /local/hoge/openapi.yaml -g go -o /local/hoge/
[main] INFO  o.o.codegen.DefaultGenerator - Generating with dryRun=false
[main] INFO  o.o.c.ignore.CodegenIgnoreProcessor - No .openapi-generator-ignore file found.
[main] INFO  o.o.codegen.DefaultGenerator - OpenAPI Generator: go (client)
[main] INFO  o.o.codegen.DefaultGenerator - Generator 'go' is considered stable.
[main] INFO  o.o.c.languages.AbstractGoCodegen - Environment variable GO_POST_PROCESS_FILE not defined so Go code may not be properly formatted. To define it, try `export GO_POST_PROCESS_FILE="/usr/local/bin/gofmt -w"` (Linux/Mac)
[main] INFO  o.o.c.languages.AbstractGoCodegen - NOTE: To enable file post-processing, 'enablePostProcessFile' must be set to `true` (--enable-post-process-file for CLI).
# 中略
[main] INFO  o.o.codegen.TemplateManager - writing file /local/hoge/.openapi-generator/FILES
################################################################################
# Thanks for using OpenAPI Generator.                                          #
# Please consider donation to help us maintain this project 🙏                 #
# https://opencollective.com/openapi_generator/donate                          #
################################################################################

③生成コードが必要最低限であること :thumbsdown:
APIクライアントプロジェクトとして成り立つコードが生成されるため要件にはそぐわない

.
|--.gitignore
|--.openapi-generator
|--.openapi-generator-ignore
|  |--FILES
|  |--VERSION
|--.travis.yml
|--README.md
|--api
|  |--openapi.yaml
|--client.go
|--configuration.go
|--docs
|  |-- # 中略
|--git_push.sh
|--go.mod
|--go.sum
|-- # 中略
|--response.go
|--test
|  |-- # 中略
|--utils.go

oapi-codegen/oapi-codegen

①ライブラリとして信頼できること :thumbsup:

  • スター数は5.8k
  • 数ヶ月に一度はバージョンアップデートされ定期的にメンテナンスされている

②生成に要す時間が短いこと :thumbsup:
計測していないが1秒以内だった

❯ go install github.com/oapi-codegen/oapi-codegen/v2/cmd/oapi-codegen@v2.3.0
go: downloading github.com/oapi-codegen/oapi-codegen/v2 v2.3.0
go: downloading github.com/getkin/kin-openapi v0.124.0
go: downloading golang.org/x/text v0.15.0
go: downloading golang.org/x/tools v0.21.0
go: downloading github.com/invopop/yaml v0.2.0
go: downloading github.com/mohae/deepcopy v0.0.0-20170929034955-c48cc78d4826
go: downloading github.com/go-openapi/jsonpointer v0.20.2
go: downloading github.com/perimeterx/marshmallow v1.1.5
go: downloading github.com/go-openapi/swag v0.22.8
go: downloading github.com/mailru/easyjson v0.7.7
go: downloading github.com/josharian/intern v1.0.0
go: downloading golang.org/x/mod v0.17.0

❯ oapi-codegen -config cfg.yaml hoge/openapi.yaml
cfg.yaml
# yaml-language-server: $schema=https://raw.githubusercontent.com/deepmap/oapi-codegen/HEAD/configuration-schema.json
package: hoge
output: hoge/client.gen.go
generate:
  models: true
  client: true

model のみであれば下記

cfg.yaml
# yaml-language-server: $schema=https://raw.githubusercontent.com/deepmap/oapi-codegen/HEAD/configuration-schema.json
package: hoge
output: hoge/only-models.gen.go
generate:
  models: true

③生成コードが必要最低限であること :thumbsup:
指定したファイルのみ

|--client.gen.go

ogen-go/ogen

①ライブラリとして信頼できること :thumbsdown:

  • スター数は1.2K
  • 1〜2ヶ月に一度はバージョンアップデートされ定期的にメンテナンスされている

②生成に要す時間が短いこと :thumbsup:
計測していないが1秒以内だった

❯ go install github.com/ogen-go/ogen/cmd/ogen@v1.3.0
go: downloading github.com/ogen-go/ogen v1.3.0
go: downloading github.com/go-faster/errors v0.7.1
go: downloading github.com/go-faster/yaml v0.4.6
go: downloading go.uber.org/zap v1.27.0
go: downloading golang.org/x/exp v0.0.0-20230725093048-515e97ebf090
go: downloading go.uber.org/multierr v1.11.0
go: downloading github.com/go-faster/jx v1.1.0
go: downloading github.com/fatih/color v1.17.0
go: downloading golang.org/x/sync v0.8.0
go: downloading golang.org/x/tools v0.24.0
go: downloading github.com/ghodss/yaml v1.0.0
go: downloading github.com/dlclark/regexp2 v1.11.4
go: downloading golang.org/x/text v0.17.0
go: downloading golang.org/x/sys v0.23.0
go: downloading golang.org/x/net v0.28.0
go: downloading github.com/segmentio/asm v1.2.0
go: downloading golang.org/x/mod v0.20.0

❯ ogen -clean -package hoge -config cfg.yaml -target . openapi.yaml
cfg.yaml
generator:
  features:
    enable:
      - 'paths/client'
      - 'debug/example_tests'
    disable_all: true

③生成コードが必要最低限であること :thumbsup:

.
|--oas_cfg_gen.go
|--oas_client_gen.go
|--oas_faker_gen.go
|--oas_interfaces_gen.go
|--oas_json_gen.go
|--oas_request_encoders_gen.go
|--oas_response_decoders_gen.go
|--oas_schemas_gen.go
|--oas_test_examples_gen_test.go
|--oas_validators_gen.go

go-swagger/go-swagger

OpenAPI3.0未対応

1
2
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
2