SYM's Tech Knowledge Index & Creation Records

「INPUT:OUTPUT=1:1以上」を掲げ構築する Tech Knowledge Stack and Index. by SYM@設計者足るため孤軍奮闘する IT Engineer.

gRPC:buf とは、buf でできること

gRPC:buf とは、buf でできること

これから使うために、単にまとめた程度

buf とは

以下が可能

  • proto ファイルのチェック
    • lint
    • フォーマット
    • 破壊的変更のチェック
      • Protocol Buffers を変更した際に前方・後方互換性を保っているかのチェック
  • BSR への登録/更新

Protocol Buffers の定義ファイルのチェックは Buf 一択でよいのでは?

※ .proto のフォーマットに clang-format は古い .proto ファイルの整形に clang-format を使う VSCode で proto ファイルのフォーマットをする

インストール

https://buf.build/docs/installation/

Windows の場合:powershell

PS C:\Users\sym> Set-ExecutionPolicy RemoteSigned -Scope CurrentUser
PS C:\Users\sym> irm get.scoop.sh | iex
Initializing...
Downloading ...
Creating shim...
Adding ~\scoop\shims to your path.
Scoop was installed successfully!
Type 'scoop help' for instructions.

PS C:\Users\sym> scoop install buf
Installing 'buf' (1.15.1) [64bit] from main bucket
buf-Windows-x86_64.exe (24.8 MB) [============================================================================] 100%
Checking hash of buf-Windows-x86_64.exe ... ok.
Linking ~\scoop\apps\buf\current => ~\scoop\apps\buf\1.15.1
Creating shim for 'buf'.
'buf' (1.15.1) was installed successfully!
PS C:\Users\sym>

初期設定&各種設定ファイル

モジュールの初期化 ※buf.yaml が自動作成される

 buf mod init

更新 ※ buf.lock が自動生成/更新される

buf mod update

buf.gen.yaml と buf.work.yaml を作成

設定ファイル

フォルダ構成例

.
├── buf.work.yaml
├── buf.gen.yaml
├── paymentapis
│   ├── acme
│   │   └── payment
│   │       └── v2
│   │           └── payment.proto
│   └── buf.yaml
└── petapis
    ├── acme
    │   └── pet
    │       └── v1
    │           └── pet.proto
    └── buf.yaml
.
├── buf.work.yaml
├── buf.gen.yaml
├── proto/
│   ├── buf.md
│   ├── buf.yaml
│   ├── google
│   │   └── type
│   │       └── datetime.proto
│   └── pet
│       └── v1
│           └── pet.proto

buf でできること

サブコマンド一覧

https://buf.build/docs/reference/cli/buf/

破壊的変更検出

Protobuf スキーマの以前のバージョンを現在のバージョンと比較する

設定は buf.yaml の breaking に行う。常に設定を行うこと推奨されている: https://buf.build/docs/breaking/overview/

  • git の main ブランチとの比較(buf.yaml がルートディレクトリ直下にある前提)
 buf breaking --against '.git#branch=main'
  • git のタグを指定しての比較
 buf breaking --against '.git#tag=v1.0.0'
buf breaking --against '.git#tag=v1.0.0,subdir=proto'
  • 特定のファイルのみ比較(複数ファイル指定可能)
 buf breaking --against '.git#branch=main' --path path/to/foo.proto --path path/to/bar.proto
  • git の リモートパスでの比較(CI 時など上記が使えない時に使える)
buf breaking --against 'https://github.com/foo/bar.git'

Github Actions での利用:https://buf.build/docs/ci-cd/github-actions/#buf-setup

docker での実行や、--config オプションでの設定上書き実行等もできる

ref: https://buf.build/docs/breaking/usage/

Lint & Format

  • Lint  ※出力形式はオプションで変更できる
 buf lint

対象ファイルを絞れる

buf lint \
  --path path/to/foo.proto \
  --path path/to/bar.proto
  • Format
buf format -w

※ -w は ファイルを上書きする指定

コード生成

buf.gen.yaml が必要

version: v1
plugins:
  - plugin: buf.build/protocolbuffers/go # buf のリモートプラグイン(最新)を使用
    #  - plugin: buf.build/protocolbuffers/go:v1.28.1  # リモートのプラグインを使用
    #  - plugin: go  # $PATH に protoc-gen-go がある場合
    out: gen/go
    opt: paths=source_relative
  - plugin: buf.build/grpc/go # buf のリモートプラグイン(最新)を使用
    #  - plugin: buf.build/grpc/go:v1.2.0  # リモートのプラグインを使用
    #  - plugin: go-grpc  # $PATH に protoc-gen-go-grpc がある場合
    out: gen/go
    opt:
      - paths=source_relative
      # - require_unimplemented_servers=false

※ connect-go の場合

version: v1
plugins:
  - plugin: buf.build/protocolbuffers/go
    out: gen/go
    opt: paths=source_relative
  - plugin: buf.build/bufbuild/connect-go
    out: gen/go
    opt: paths=source_relative

コマンド

buf generate  #
buf generate <フォルダ>  # .proto が全てサブフォルダにある場合
buf generate buf.build/acme/petapis
  • 使用ファイルの指定
buf generate --template buf.gen.go.yaml
buf generate --template buf.gen.java.yaml
  • 出力先の指定
buf generate https://github.com/foo/bar.git --template data/generate.yaml -o bar

--path でのファイル指定や、docker 実行等も可能 ref : https://buf.build/docs/generate/usage/#5.4.-limit-to-specific-files

ローカルでコード生成せず、BSR のコードを利用

BSR への登録 ref: https://buf.build/docs/bsr/module/dependency-management/#add-a-dependency

buf.gen.yaml は削除

 package main

 import (
     "context"
     "fmt"
     "log"

-    // This import path is based on the name declaration in the go.mod,
-    // and the gen/proto/go output location in the buf.gen.yaml.
-    petv1 "github.com/bufbuild/buf-tour/petstore/gen/proto/go/pet/v1"
+    petv1 "buf.build/gen/go/<USERNAME>/petapis/protocolbuffers/go/pet/v1"
+    "buf.build/gen/go/<USERNAME>/petapis/grpc/go/pet/v1/petv1grpc"
     "google.golang.org/grpc"
 )

ビルド

json やバイナリ(bin), zip, tar 等出力できる

オプションなしは何も出力しない

buf build

オプションなしは以下と同じ

protoc \
    -I proto \
    -I vendor/protoc-gen-validate \
    -o /dev/null \
    $(find proto -name '*.proto')

buf build の場合のフォルダ構成と buf.work.yaml

.
├── buf.work.yaml
├── proto
│   ├── acme
│   │   └── weather
│   │       └── v1
│   │           └── weather.proto
│   └── buf.yaml
└── vendor
    └── protoc-gen-validate
        ├── buf.yaml
        └── validate
            └── validate.proto
# buf.work.yaml
version: v1
directories:
  - proto
  - vendor/protoc-gen-validate

パッケージ一覧表示

buf build -o -#format=json | jq '.file[] | .package' | sort | uniq | head
$ buf build -o image.bin
$ buf build -o image.json
$ buf build -o image.zip
$ buf build -o image.tar

※ 指定可能フォーマット:https://buf.build/docs/reference/inputs/format/#options

出力対象を絞ったり、docker 実行等もできる

ref: https://buf.build/docs/build/usage/

buf curl による API 実行

Connect、gRPC、または gRPC-Web サーバで RPC を呼び出せる

buf curl \
    --data '{"sentence": "I feel happy."}' \
    https://demo.connect.build/buf.connect.demo.eliza.v1.ElizaService/Say

デフォルトの RPC プロトコルは Connect。変更可能

 buf curl --protocol grpc --http2-prior-knowledge \
    http://localhost:20202/foo.bar.v1.FooService/DoSomething

※ http を使用する場合、HTTP/1.1 が使用されるため、HTTP/2 を使うためには --http 2-prior-knowledge が必要

buf curl の実行は、サーバがサーバリフレクションサービスを公開することを期待する。ない場合は、--schema の指定が必要。値は BSR でも、Git リポジトリでも、ローカルでも可

buf curl \
   --schema buf.build/bufbuild/eliza \
   --data '{"name": "Bob Loblaw"}' \
   https://demo.connect.build/buf.connect.demo.eliza.v1.ElizaService/Introduce

サーバリフレクションとは

ref: https://buf.build/docs/curl/usage/

BSR への 登録/更新

前提: https://buf.build/settings/user にアクセスして トークンを作成

  • ログイン
buf registry login
  • 画面からリポジトリ作成
  • buf.yaml があるフォルダに移動
  • buf.yamlname: <リポジトリ名> を追加
  • buf push  (更新する度実行)

タグ付けも可能

buf push --tag "$(git rev-parse HEAD)"

依存関係がある場合は、以下で更新可能

buf mod update

ref: