protobuf buf.build使用

protobuf buf.build使用 protoc的团队方案传统的pb文件生成pb文件的生成往往是这样的protoc --proto_path./api \ --proto_path./third_party \ --go_outpathssource_relative:./api \ --go-http_outpathssource_relative:./api \ --go-grpc_outpathssource_relative:./api \ --openapi_outfq_schema_namingtrue,default_responsefalse:. \或者是这样的protoc --proto_path. --go_outpathssource_relative:../ ./*.proto protoc --proto_path. --go-grpc_outpathssource_relative:../ ./*.proto protoc --proto_path. --go-http_outpathssource_relative:../ ./*.proto protoc --proto_path. --go-errors_outpathssource_relative:../ ./*.proto protoc --proto_path. --validate_outpathssource_relative,langgo:../ ./*.proto protoc --proto_path. --openapi_outnamingjsonpathssource_relative:../ ./*.proto当模块变多拆分成多个.proto文件时需要很多的命令执行就算写到makefile中也不是特别的方便看起来不够结构化如果多人开发依赖一些远程库时还会有不同版本号差异的异常发生一个适用于团队的替代方案buf.build 是一个专门解决.proto与xxx.pb的团队管理协作方案主要提供了两个工具Buf Schema Registry(BSR): 官方网址buf.build是一个用于管理和共享 Protocol Buffersprotobuf代码的平台。Buf Cli: 是一个强大的命令行工具提供了一系列用于处理、验证和管理 protobuf 代码的功能。BSR 就相当于一个远程的.proto代码仓库Cli 相当于protoc命令替代品也用于操作远程仓库类似(gitprotoc)组合版安装非常方便go install github.com/bufbuild/buf/cmd/buflatest验证buf --versionstart新建目录mkdir bufbuild cd bufbuild初始化buf config init此时目录下多了一个buf.yaml文件# For details on buf.yaml configuration, visit https://buf.build/docs/configuration/v2/buf-yamlversion:v2lint:use:-STANDARDbreaking:use:-FILE将其稍做修改version:v2modules:-path:proto# 指定 proto 目录为根目录lint:use:-STANDARD# 如果想放宽规则可以禁用某些检查except:-PACKAGE_DIRECTORY_MATCH# 禁用包路径必须匹配目录结构的检查breaking:use:-FILE创建业务 .proto这个 .proto 文件是模拟真实业务的vim hello.proto我们把这个文件放在文件夹/proto/hello/v1下面syntax proto3; package hello.v1; option go_package bufbuild/proto/hello/v1;v1; // 问候服务 service GreetingService { // 发送问候 rpc SayHello(SayHelloRequest) returns (SayHelloResponse); // 发送多个问候流式 rpc SayHelloStream(SayHelloStreamRequest) returns (stream SayHelloStreamResponse); } // SayHello 请求 message SayHelloRequest { // 用户名称 string name 1; } // SayHello 响应 message SayHelloResponse { // 问候消息 string message 1; // 时间戳 int64 timestamp 2; } // SayHelloStream 请求 message SayHelloStreamRequest { // 用户名称 string name 1; } // SayHelloStream 响应 message SayHelloStreamResponse { // 问候消息 string message 1; // 时间戳 int64 timestamp 2; }检查 .proto 语法根目录下执行buf lint这个是查语法是否有误根目录下执行buf format这个是格式化代码依赖diff命令win 建议用 git bash 打开只想看格式化效果不修改原文件 → 用buf format。想直接按规范格式化并保存到原文件 → 用buf format -w。创建生成代码的文件buf.gen.yaml:这里我们以go语言为例创建起对应的pb结构文件以及rpc服务根目录下创建即可version:v2plugins:# 生成 Go 代码-remote:buf.build/protocolbuffers/goout:gen/goopt:-pathssource_relative# 生成 gRPC Go 代码-remote:buf.build/grpc/goout:gen/goopt:-pathssource_relative生成代码buf generate注意哈默认会读取buf.yaml 和 buf.gen.yaml文件如需指定文件则需要--template参数推送模块 推送到远程BSRbuf.build 提供了一个像github仓库一样的远程CICD仓库 官方仓库登录 (首次使用)buf registry login点击授权同意即可密钥将会自动保存在你的主机上创建仓库 (在 buf.build 网站上) 新建一个组织naive-buf再新建一个仓库helloworld推送远程仓库需要在buf.yaml中配置以下地址modules 配置块下新增name: buf.build/naive-buf/helloworld推送命令buf push远程仓库中最终存储的只有 README.md 文件和.proto文件源码 code