前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Protocol Buffers的扩展工具:Buf

Protocol Buffers的扩展工具:Buf

作者头像
Yuyy
发布2022-09-21 10:22:38
1.8K0
发布2022-09-21 10:22:38
举报
文章被收录于专栏:yuyy.info技术专栏

解决的问题

  • API 设计通常不一致
  • 依赖管理通常是事后才想到的
  • 不强制执行向前和向后兼容性
  • proto文件分发是一个困难的、未解决的过程
  • 工具生态系统是有限的

Buf Schema Registry

proto文件的托管平台,方便proto文件的分发

buf CLI

buf build

验证一切设置是否正确,运行后没有输出意味着当前目录中定义的所有.proto文件都成功编译。

buf mod init:创建buf.yaml

代码语言:javascript
复制
version: v1
deps:
- buf.build/googleapis/googleapis
lint:
use:
  - DEFAULT
breaking:
use:
  - FILE

可引入网上公开的依赖

代码语言:javascript
复制
deps:
- buf.build/googleapis/googleapis

仅编译某一个type

代码语言:javascript
复制
buf build \
--type acme.weather.v1.Units \
--type acme.weather.v1.CurrentWeather.Temperature
  • type可以为message、enum、server

还可以使用docker去build

代码语言:javascript
复制
docker run \
--volume "$(pwd):/workspace" \
--workdir /workspace \
bufbuild/buf build

buf generate

buf.gen.yaml使用插件,编译go、grpc的proto

语法较多,用到了再看官方文档

代码语言:javascript
复制
# 配置protoc生成规则
version: v1
managed:
enabled: true
go_package_prefix:
# proto文件中不使用option定义包名称,因为proto生成代码可以放在不同项目中使用,因此在buf.gen.yaml中进行定义
default: go/apigen
except:
  - buf.build/googleapis/googleapis
plugins:
# 使用go插件生成go代码
- name: go
out: apigen/go
opt: paths=source_relative
# 使用go-grpc插件生成grpc代码
- name: go-grpc
out: apigen/go
opt:
  - paths=source_relative
  - require_unimplemented_servers=false 
# 使用grpc-gateway插件生成grpc-gateway代码
- name: grpc-gateway
out: apigen/go
opt: paths=source_relative
# 使用openapiv2插件生成swagger文件
- name: openapiv2
out: apigen
opt:
  - allow_repeated_fields_in_body=true

使用远端的proto文件

buf generate buf.build/acme/petapis

指定使用的template

代码语言:javascript
复制
buf generate --template buf.gen.go.yaml
buf generate --template buf.gen.java.yaml

指定需要生成的文件

代码语言:javascript
复制
buf generate --path proto/foo --path proto/bar

指定输出目录

代码语言:javascript
复制
buf generate https://github.com/foo/bar.git --template data/generate.yaml -o bar

buf ls-files

buf lint

运行所有配置的 lint 规则

查看具体的错误,对应的规则buf lint --error-format=json

buf.yaml中配置检查规则

代码语言:javascript
复制
version: v1
lint:
 use:
   - DEFAULT
 except:
   - PACKAGE_VERSION_SUFFIX
   - FIELD_LOWER_SNAKE_CASE
   - SERVICE_SUFFIX
 ignore:
   - google/type/datetime.proto  
breaking:
 use:
   - FILE

buf breaking

  • 检查是否有重大改变(影响兼容性) buf breaking --against ../../.git#branch=main,subdir=start/petapis:和git main分支对比
  • 跨项目时留意

buf mod update

更新依赖(会生成buf.lock文件)

工作空间

实现跨模块引用

代码语言:javascript
复制
.
├── buf.work.yaml
├── proto
│   ├── acme
│   │   └── weather
│   │       └── v1
│   │           └── weather.proto
│   └── buf.yaml
└── vendor
    └── protoc-gen-validate
        ├── buf.yaml
        └── validate
            └── validate.proto
buf.work.yaml
代码语言:javascript
复制
version: v1
directories:
  - proto
  - vendor/protoc-gen-validate
  • 工作空间模块不能重叠,即一个工作空间模块不能是另一个工作空间模块的子目录。
  • 所有.proto文件路径相对于每个工作区模块必须是唯一的。 导入时用到了不包含工作空间名的路径,无法区分
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022-4-15 1,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 解决的问题
  • Buf Schema Registry
  • buf CLI
    • buf build
      • buf generate
        • buf ls-files
          • buf lint
            • buf breaking
              • buf mod update
                • buf.work.yaml
            • 工作空间
            相关产品与服务
            容器服务
            腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
            领券
            问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档