📠

【gRPC】Bufを使用する際のprotoファイル間のimport

2023/11/28に公開

概要

gRPCを使用する際にBufという、protoからのコード出力を管理するツールがあります。このツールの詳細はprotocからBufに乗り換えて設定をソースコード管理しようの記事で紹介されています、yamlファイルで設定を管理できるので導入することは個人的には良いかなと思います。
さて、このBufを使った時にprotoファイル間のimportってどうなるのというのを、今回メモ書きします。

前提

以下のフォルダ構成を前提とします。
protoファイルはprotoフォルダ配下、出力するコードはsrc/gen配下に設定するものとします。sampleUser.protoからsampleCommon.protoをimportします。

ルートフォルダ
├ proto
│ ├ sampleCommon.proto
│ └ sampleUser.proto
├ src
│ └ gen
└ buf.gen.yaml

結論

Protocol Buffer の import におけるファイルの取扱いについての記事にある通り、相対パスでimportするファイルを指定すれば基本的には問題ないです。
以下にバックエンド側Golangとクライアント側TypeScriptの設定サンプルを記載しておきます、connect-grpcの設定もしていますがconnectは使用しないでも大丈夫です。

Golangでの設定サンプル

ルートフォルダからbuf generateでコードを出力します。

buf.gen.yaml
version: v1
plugins:
  - name: go
    out: src/gen
    opt: paths=source_relative
  - name: connect-go
    out: src/gen
    opt: paths=source_relative
sampleCommon.proto
syntax = "proto3";

option go_package = "root_folder/src/gen/proto;sample";

package sample;
・
・
・
sampleUser.proto
syntax = "proto3";

option go_package = "root_folder/src/gen/proto;sample";

import "proto/sampleCommon.proto";

package placeNote;
・
・
・

TypeScriptでの設定サンプル

ルートフォルダからnpx buf generate ./protoでコードを出力する前提とします。
その場合protoの相対パスのルートがprotoフォルダになるので、importもそれに合わせます。

buf.gen.yaml
version: v1
plugins:
  - plugin: es
    out: src/gen
    opt: target=js+dts
  - plugin: connect-query
    out: src/gen
    opt: target=js+dts
sampleCommon.proto
syntax = "proto3";

package sample;
・
・
・
sampleUser.proto
syntax = "proto3";

import "sampleCommon.proto";

package sample;
・
・
・

Discussion