🚀

protoファイルからのコード生成: protoc と buf の比較

2025/01/11に公開

この記事では、gRPCのKeepalive設定について調べてみたで使用したプロジェクトフォルダ構成を基に、.protoファイルからGoおよびgRPCのコードを生成する方法を、従来のprotocと新しいツールであるbufを使って比較し、bufの利便性を紹介します。

プロジェクトフォルダ構成

まず、プロジェクトのディレクトリ構成は以下のとおりです。
(関係ないファイルは省略しています)

.
├── example/
├── example.proto
└── go.mod

example.protoの内容は以下のとおりです。

syntax = "proto3";

package example;

option go_package = "github.com/shunta-furukawa/zenn-demo/986d1e236326cd/example";

service YourService {
  rpc YourRPCMethod (YourRequest) returns (YourResponse);
}

message YourRequest {
  string name = 1;
}

message YourResponse {
  string message = 1;
}

この構成で example 配下に protoファイルから生成した goファイルを出力することを目指します。

protocを使用したコード生成

従来、protocを使用してコード生成を行う手順は以下のとおりです。

  1. 必要なツールのインストール:

    Go用のプラグインをインストールします。

    go install google.golang.org/protobuf/cmd/protoc-gen-go@latest
    go install google.golang.org/grpc/cmd/protoc-gen-go-grpc@latest
    
  2. 環境変数の設定:

    GoのバイナリディレクトリをPATHに追加します。

    export PATH="$PATH:$(go env GOPATH)/bin"
    
  3. コード生成の実行:

    protocコマンドを使用して、GoおよびgRPCのコードを生成します。

    protoc --go_out=./example --go_opt=paths=source_relative \
    --go-grpc_out=./example --go-grpc_opt=paths=source_relative \
    ./example.proto 
    

この手順では、複数のツールのインストールや環境設定が必要であり、コマンドも複雑です。

bufを使用したコード生成

bufを使用すると、これらの手順が簡素化されます。

  1. bufのインストール:

    bufをインストールします。

    brew install bufbuild/buf/buf
    
  2. プロジェクトの初期化:

    プロジェクトディレクトリで以下のコマンドを実行して、buf.yamlを作成します。

    buf config init
    

    これにより、次のようなbuf.yamlファイルが生成されます。

    version: v2
    
  3. コード生成設定の作成:

    buf.gen.yamlファイルを手動で作成し、次の内容を記述します。

    version: v2
    plugins:
      - remote: buf.build/protocolbuffers/go
        out: example
        opt: paths=source_relative
      - remote: buf.build/grpc/go
        out: example
        opt: paths=source_relative
    
  4. コード生成の実行:

    以下のコマンドを実行して、コード生成を行います。

    buf generate
    

bufを使用することで、設定ファイルに必要な情報を記述し、シンプルなコマンドでコード生成が可能となります。

bufのメリット

  • 一元管理: 設定ファイルでプロジェクトの構成やコード生成の設定を一元管理できます。
  • 依存関係の自動管理: リモートプラグインを指定することで、ローカル環境にプラグインをインストールする必要がなく、依存関係の管理が容易です。
  • 簡潔なコマンド: buf generateコマンドだけで複数のコード生成を実行でき、コマンドの複雑さが軽減されます。
  • 高機能: bufはLintやブレイキングチェンジの検出など、プロトコルバッファの管理に役立つ多くの機能を提供しています。

これらの理由から、bufを使用することで、プロトコルバッファのコード生成や管理がより効率的かつ簡潔になります。

まとめ

今回は、.protoファイルからのコード生成におけるbufの基本的な使い方と、protocとの比較を紹介しました。しかし、bufには今回詳細に触れられなかった機能がまだたくさんあります。例えば、Lintやブレイキングチェンジの検出機能のカスタマイズ、Buf Schema Registry(BSR)の活用など、さらに深く掘り下げるべきポイントが多くあります。

正直なところ、自分もまだまだbufについて研究中で、すべてを使いこなしているわけではありません。ただ、今回触れてみて、その利便性と柔軟性を実感しました。

今後、もっといろいろな機能を試し、さらに理解を深めていければと思っています。そして、最終的には完全にprotocベースからbufへ移行できたら嬉しいなと考えています。

この記事がbufに興味を持つきっかけになれば幸いです。ぜひ一緒にbufの世界を探求してみましょう!

Discussion