protoc
protoc は、.proto (Protocol Buffers) から各言語で利用できるコードを生成するコンパイラー
code:console
$ protoc \
--go_out='paths=source_relative:../backend/pb' \
--go-grpc_out='paths=source_relative:../backend/pb' \
--ts_out='../frontend/src/pb' \
./*.proto
プラグイン
protoc はプラグインによって、対応言語を拡張可能
上の例では $PATH から protoc-gen-go protoc-gen-go-grpc protoc-gen-ts という実行ファイルを探してコンパイルを実行する
プラグイン紹介
protoc-gen-go
Go の型定義を生成してくれる
protoc-gen-go-grpc
protoc-gen-ts
TypeScript の型定義 (.d.ts) / クライアント / サーバー (.ts) を生成してくれる
protoc-gen-grpc-web
TypeScript の型定義 (.d.ts) / JavaScript のクライアント (CommonJS) を生成してくれる
今後 TypeScript のコードを吐き出せるようになるらしい
CommonJS のコードが Vite と組み合わせたときに上手く動かなかったので見送りました...
CommonJS を変換する Vite プラグインを使ってみたけど動かなかった...
protoc を楽に実行したい
便利な Docker イメージがあります
protoc とよく使われるプラグインがバンドルされている
code:console
$ docker run --rm -it namely/protoc-all:1.51_1 -h
上記 protoc-gen-ts は含まれていないので別途入れる
code:console
$ apt install -y nodejs
$ npm i @protobuf-ts/plugin -g --force
.proto を watch して快適に開発したい
protoc-all が amd64 イメージしかないので reflex も amd64 を取ってきています
code:Dockerfile
FROM namely/protoc-all:1.51_1 AS development
WORKDIR /app
&& apt install -y nodejs \
&& npm i @protobuf-ts/plugin -g --force \
code:compile.sh
protoc \
--go_out='paths=source_relative:../backend/pb' \
--go-grpc_out='paths=source_relative:../backend/pb' \
--ts_out='../frontend/src/pb' \
./*.proto
code:docker-compose.yml
version: '3.8'
services:
protobuf:
build:
context: protobuf
target: development
volumes:
- ./protobuf:/app:ro
# 出力先
- ./backend/pb:/backend/pb
- ./frontend/src/pb:/frontend/src/pb