Slide 1

Slide 1 text

protoc pluginのはじめかた 10/24/2024 sivchari CyberAgent The Go gopher was designed by Renée French.

Slide 2

Slide 2 text

自己紹介 protoc pluginとは protoc pluginを使用するメリット extensions protoc pluginの書き方 まとめ

Slide 3

Slide 3 text

自己紹介

Slide 4

Slide 4 text

● Takuma Shibuya ○ X/GitHub sivchari ● CIU ○ AKE (Astro Kubernetes Engine) ● CyberAgent Go Next Experts ● Go Conference主催

Slide 5

Slide 5 text

protoc pluginとは

Slide 6

Slide 6 text

● protoc pluginはProtocol Buffersで提供されている拡張点 ○ –go_outや--go_grpc_outなどがそう ● protocはオプションとして--XXX_outを渡すとprotoc-gen-XXXを呼 び出すように設計されている ○ gRPC x Go tutorial ref. Protocol Buffers Documentation protoc plugin

Slide 7

Slide 7 text

Architecture Proto files Protoc CodeGeneratorRequest CodeGeneratorResponse Write to CodeGeneratorResponse Generated Files Protoc Plugin

Slide 8

Slide 8 text

protoc pluginを使うメリット

Slide 9

Slide 9 text

● 拡張点でのコードの自動生成 ○ 認証認可 ○ 自動計装 ○ 各種SaaSの設定を差し込む ○ validation ○ IaC ● protoにあらゆる情報を集約することができる ○ ツールの設定情報が分散しない ○ proto : XXXのようなものがある際の設定情報の乖離防止 protoc pluginを使うメリット

Slide 10

Slide 10 text

extensions

Slide 11

Slide 11 text

● protoc pluginが拡張点を実現するために必須の機能 ● optionは様々な文法に対して書くことができる ○ File ○ Message ○ Field ○ Service ○ etc.. extensions

Slide 12

Slide 12 text

rpc EchoBoyd(SimpleMessage) returns (SimpleMessage) { option (google.api.http) = { post: “/v1/example/echo_body” body: “*” // snip } } ref. gRPC-Gateway extensions

Slide 13

Slide 13 text

● protoのenumに何かオプションを足したい場合に都度それぞれが Change Requestを出すのは非現実的 ● extendを用いて拡張する ○ protoのフィールドはタグ番号で識別される ○ メッセージの拡張用のタグ番号は`extensions N to N` ○ 各種フィールドが用意してくれている拡張用のタグ番号に対して extendすることで拡張することができるようになる ○ タグ番号の範囲は1~536,870,911 (enumは1000 to max) ref. Google APIs extensions

Slide 14

Slide 14 text

protoc pluginの書き方

Slide 15

Slide 15 text

● protoc pluginはCodeGeneratorRequestを受け取り、 CodeGeneratorResponseを返せばOK ● 選択肢はいくつかある ○ os.Stdinから自分でかく ○ protobuf-go/compiler/protogenを使用する ○ lyft/protoc-gen-starをつかう protoc pluginの書き方

Slide 16

Slide 16 text

● 今回はmessage fieldのoptionにdescriptionというoptionを用意 する ○ descriptionが記載されているフィールドは ${MessageName}${FieldName}Descriptionという関数を自 動生成するようにする ○ サンプルコードをベースにして説明していきます ref. protoc-gen-description protoc pluginの書き方

Slide 17

Slide 17 text

まとめ

Slide 18

Slide 18 text

● protocにはpluginという自動生成用の拡張点がある ● protoを静的解析して取得したASTを用いてpluginを実装することで Goのコードを生成することができる ● pluginとその他Goの静的解析ツールを組み合わせることでプロダク ションの多くのコードを自動生成できる まとめ

Slide 19

Slide 19 text

感想待ってます