buf vs protoc: モダンな Protobuf ツールとコンパイラの比較
protoc は Protocol Buffers の公式コンパイラであり、buf は lint、breaking change 検出、依存関係管理でワークフローをラップしてモダン化します。
protoc は plugin を介して .proto ファイルをコードにコンパイルしますが、include、plugin、一貫性の管理は手動です。buf は同じコンパイルの上に、より高レベルなワークフロー(buf.yaml、lint、breaking change のチェック、リモート plugin、schema registry)を提供します。
| buf | protoc | |
|---|---|---|
| 役割 | ワークフロー: lint、breaking、generate | リファレンスコンパイラ |
| Linting | 組み込み | なし |
| breaking change の検出 | 組み込み | なし |
| 依存関係管理 | buf.yaml + registry | 手動の include path |
| 設定 | buf.yaml / buf.gen.yaml | コマンドラインフラグ / スクリプト |
buf が優れている点
buf は protobuf を管理されたワークフローに変えます。スタイルルールに対して schema を lint し、baseline に対して breaking change を検出し、依存関係を管理し、明確な設定でコードを生成します。CI ではこれにより、互換性のない API 変更が出荷される前に捕捉でき、これは素の protoc にはできません。
protoc が今なお適する点
protoc は正統なコンパイラであり、最小限のセットアップ、特殊な plugin、あるいはもう一つツールを追加したくない環境では今も正しい選択です。buf は結局のところ同じ生成の概念に依存しており、一部のパイプラインはスクリプト化された protoc で十分なほど単純です。
CI では
一般的なパイプラインは、各 PR で buf lint と buf breaking を実行し、その後 buf generate を実行します。これにより protoc にはない schema の品質ゲートが得られます。コード生成だけが必要で plugin のセットアップが安定しているなら、protoc とスクリプトで動きます。
結論
CI で protobuf の lint、breaking change 検出、管理された依存関係が欲しいなら buf を使い、最小限または特殊な生成ニーズには protoc を使いましょう。共有 schema を保守するほとんどのチームは buf の恩恵を受けます。