使用 buf 替代 protoc 生成和管理代码

编辑于 2022-10-26 09:57:51 阅读 1233

以go为例,下面是所需工具

工具 介绍 安装
protobuf protoc 可执行文件 Install
protoc-gen-go 从 proto 文件,生成 .go 文件 Install
protoc-gen-go-grpc 从 proto 文件,生成 GRPC 相关的 .go 文件 Install
protoc-gen-grpc-gateway 从 proto 文件,生成 grpc-gateway 相关的 .go 文件 Install
protoc-gen-openapiv2 从 proto 文件,生成 swagger 所需的json文件 Install

buf出现之前

buf出现之前,我们只能使用protoc,配合一堆参数来生成代码

cuiwei@weideMacBook-Pro protobuf % protoc --go_out=. --go-grpc_out=require_unimplemented_servers=false:. ./helloworld.proto 

cuiwei@weideMacBook-Pro protobuf % protoc -I . --grpc-gateway_out ../gen \
--grpc-gateway_opt logtostderr=true \
--grpc-gateway_opt paths=source_relative \
--grpc-gateway_opt generate_unbound_methods=true \
helloworld.proto

buf 的使用

安装

//macOS
brew install bufbuild/buf/buf

登陆 Buf Schema Registry (BSR)

在此之前,确保你已经创建了API令牌

cuiwei@weideMacBook-Pro ent-serve % buf registry login

cuiwei@weideMacBook-Pro ~ % cat ~/.netrc
machine buf.build
  login cuiwei
  password 95b5be604e7f44eaaa48c031756da4c63547b8d7b21849e6b0f。。。
machine go.buf.build
  login cuiwei
  password 95b5be604e7f44eaaa48c031756da4c63547b8d7b21849e6b0f。。。

创建blog模块,或者在网站后台添加

cuiwei@weideMacBook-Pro ent-serve % buf beta registry repository create buf.build/cuiwei/blog --visibility public

推送模块

cuiwei@weideMacBook-Pro ent-serve % cd blogapis
cuiwei@weideMacBook-Pro ent-serve % ls blogapis 
blog            buf.md          buf.yaml
cuiwei@weideMacBook-Pro blogapis % buf push

此模块已公开,欢迎使用:https://buf.build/cuiwei/blog

创建buf.gen.yaml文件

version: v1
managed:
  enabled: true
  go_package_prefix:
    default: ent/gen/proto/go

plugins:
  - name: go
    out: gen/proto/go
    opt: paths=source_relative
  - name: go-grpc
    out: gen/proto/go
    opt:
      - paths=source_relative
      - require_unimplemented_servers=false

创建buf.work.yaml文件

version: v1
directories:
  - blogapis

生成代码

确保已创建了buf.gen.yaml文件

cuiwei@weideMacBook-Pro ent-serve % buf generate
cuiwei@weideMacBook-Pro ent-serve % tree gen 
gen
└── proto
    └── go
        └── admin
            └── v1
                ├── admin.pb.go
                ├── article.pb.go
                ├── error.pb.go
                ├── service.pb.go
                └── service_grpc.pb.go

4 directories, 5 files

远程生成

首先,在您使用go get请求Go代码存根之前,不会生成Go代码存

go get go.buf.build/grpc/go/cuiwei/blog

其次,修改import

 import (
-    blogv1 "enterprise-api/gen/proto/go/blog/v1"
+    blogv1 "go.buf.build/grpc/go/cuiwei/blog/admin/v1"
 )

如果需要更新,可以修改go.mod中的版本号

参考

https://docs.buf.build/tour/introduction

https://docs.buf.build/tour/use-remote-generation

https://blog.csdn.net/pointgoal_io/article/details/120500504

广而告之,我的新作品《语音助手》上架Google Play了,欢迎下载体验