Docker image with a set of golang generators for protobuf-based projects
Описание сервиса в .proto позволяет генерить и документацию и множество полезного кода. Используемые для этого генераторы развиваются и регулярно обновляют версии. Когда генераторы ставятся локально и в команде есть несколько разработчиков, может возникнуть ситуация, что у разных разработчиков установлены разные версии генераторов. И они генерят разный код (например, зашивая в него свою версию). В результате коммиты замусориваются (а могут и портиться) не связанными с .proto изменениями сгенерированного кода. Посчитав это проблемой, мы нашли 2 решения:
- Добавить версии генераторов в зависимости проекта
- Собрать генераторы в образ docker и всей командой его использовать
Проект gogens - вариант решения 2.
Packages used via buf.build
-
protoc-gen-grpc-gateway and protoc-gen-openapiv2 from grpc-gateway
See here
id=$$(docker create ghcr.io/apisite/gogens) ; \
docker cp $id:/app/buf.lock buf.lock ; \
docker rm -v $id
For ./proto/service.proto run command
docker run --rm -v `pwd`:/mnt/pwd -w /mnt/pwd ghcr.io/apisite/gogens:latest generate --template buf.gen.yaml --path proto
Result:
- proto/README.md - markdown docs for .proto
- zgen/go/proto - golang code ** service_grpc.pb.go - gRPC service ** service.pb.go ** service.pb.gw.go - JSON service ** service.pb.validate.go - API validator
- zgen/ts - typescript code ** proto/service.pb.ts - TS client ** fetch.pb.ts - fetch lib
For generated zgen/ts files run
docker run --rm -v `pwd`:/mnt/pwd -w /mnt/pwd --entrypoint /go/bin/esbuild ghcr.io/apisite/gogens:latest \
zgen/ts/proto/service.pb.ts --bundle --outfile=/mnt/pwd/static/js/api.js --global-name=AppAPI
Result:
- static/js/api.js - service JS client for use in browser