Flutter项目使用 buf.build

buf.build 是现在主流的 Protocol Buffers 规范化、版本管理与发布平台。 无论是单机开发还是企业 CI/CD 场景,它都能让 *.proto 文件像 npm 包一样统一管理。

适合 Flutter、Go、Dart、Rust、Python 等多语言开发环境。


🧭 Buf.build 使用笔记(2025 实用整理版)


✨ 一、Buf 是什么

Buf 是一个针对 Protocol Buffers(Protobuf) 生态的工具链与云平台,提供:

功能 说明
buf lint 检查 Protobuf 文件风格规范(统一命名、包结构)
buf breaking 检查 API 向后兼容性(避免破坏性变更)
buf build 统一生成 .bin 格式描述符集
buf generate 自动生成多语言代码
buf registry 类似 GitHub,用于托管 .proto 文件与版本发布
buf.yaml / buf.gen.yaml 项目配置文件,定义结构与生成方案

⚙️ 二、安装与初始化

🧩 安装 CLI

Windows
powershell 复制代码
choco install buf

或使用 Scoop:

powershell 复制代码
scoop install buf
Mac / Linux
bash 复制代码
brew install buf

或:

bash 复制代码
curl -sSL https://github.com/bufbuild/buf/releases/latest/download/buf-WINDOWS-x86_64.exe -o buf.exe

确认版本:

bash 复制代码
buf --version

🚀 初始化项目

进入你的 proto 根目录:

bash 复制代码
cd proto/
buf init

这会生成:

yaml 复制代码
# buf.yaml
version: v2
modules:
  - path: .

再添加生成配置:

bash 复制代码
touch buf.gen.yaml

示例:

yaml 复制代码
version: v2
plugins:
  - plugin: buf.build/protocolbuffers/python
    out: gen/python
  - plugin: buf.build/protocolbuffers/go
    out: gen/go
  - plugin: buf.build/community/dart
    out: gen/dart

📁 三、推荐项目结构

csharp 复制代码
proto/
 ├── buf.yaml
 ├── buf.gen.yaml
 ├── buf.lock
 ├── example.proto
 ├── google/
 │    └── api/
 │         └── annotations.proto
 └── mypackage/
      ├── message.proto
      ├── service.proto
      └── types.proto

🧪 四、常用命令

命令 功能
🩰 buf lint 检查命名、包名、service 格式
🧱 buf build 生成中间描述文件(buf.bin
🔄 buf generate 根据 buf.gen.yaml 生成多语言代码
🧩 buf breaking --against ... 比较与上次发布版本是否兼容
🚢 buf push 将当前 module 发布到 buf.build
📥 buf export 下载远程仓库的 proto 文件

🎯 五、与 buf.build 注册中心配合使用

  1. 登录

    bash 复制代码
    buf login

    (首次会要求访问 buf.build 复制 Token)

  2. 创建仓库(类似 GitHub) 在 buf.build → "New Repository"

  3. 推送模块

    bash 复制代码
    buf push buf.build/<organization>/<repository>
  4. 拉取别人模块

    bash 复制代码
    buf export buf.build/googleapis/googleapis --output ./third_party

Buf 会自动管理依赖 resolution(在 buf.lock 中记录版本和哈希)。


🧰 六、常见文件说明

buf.yaml

项目自身的配置:

yaml 复制代码
version: v2
modules:
  - path: .
deps:
  - buf.build/googleapis/googleapis
lint:
  use:
    - DEFAULT
breaking:
  use:
    - FILE

buf.gen.yaml

生成配置示例:

yaml 复制代码
version: v2
managed:
  enabled: true
plugins:
  - plugin: buf.build/protocolbuffers/go
    out: gen/go
  - plugin: buf.build/community/dart
    out: gen/dart

🧩 七、Dart 与 Flutter 集成示例

在 pubspec.yaml 中添加依赖:

yaml 复制代码
dependencies:
  protobuf: ^3.1.0
  grpc: ^3.2.4

生成 Dart 代码:

bash 复制代码
buf generate

生成后文件位置:

markdown 复制代码
lib/
  └── proto/
       └── mypackage.pb.dart

🧠 八、最佳实践笔记

场景 建议
多人协作开发 proto 使用 buf lint & breaking,防止不兼容修改
CI 检查 在 GitHub Actions 执行 buf lintbuf breaking
开源接口依赖 使用 buf.build/googleapis/googleapis 代替手动下载 .proto
本地构建多语言 SDK 修改 buf.gen.yaml 支持多 plugin 输出
Flutter + Rust/Go 后端共用协议 一次定义,buf generate 多端生成

🧩 九、CI/CD 集成示例(GitHub Actions)

.github/workflows/buf.yaml

yaml 复制代码
name: buf check

on: [push, pull_request]

jobs:
  lint:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - uses: bufbuild/buf-action@v1
        with:
          args: lint
  breaking:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - uses: bufbuild/buf-action@v1
        with:
          args: breaking --against buf.build/myorg/myrepo

🧾 十、资源

链接 内容
🏠 buf.build 官方主站
📘 docs.buf.build 官方文档
🧰 github.com/bufbuild/bu... CLI 源码
🪄 Protobuf 官方 语法和编译器规范

🔚 总结

Buf.build 是 Protobuf 的现代化解决方案, 核心价值是------一致性(Lint)、安全演进(Breaking)、多语言生成、集中化发布。 掌握以下 4 条命令,你就几乎能完成全部常见任务:

bash 复制代码
buf mod update     # 更新依赖
buf lint           # 检查规范
buf generate       # 生成代码
buf push           # 发布到 registry

提示: 如果版本不匹配,可以降版本。具体操作如下:

buf.gen.yaml

yaml 复制代码
version: v1
plugins:
  - plugin: buf.build/protocolbuffers/dart:v22.5.0
    out: lib/protos/raw/src

直接复制上面的 buf.build/protocolbuffers/dart 到浏览器,然后测试不同的版本

相关推荐
天天开发8 小时前
Flutter每日库: image_picker选取相册图片视频
flutter
消失的旧时光-19439 小时前
Flutter 组件:StatelessWidget vs StatefulWidget
flutter
天意__9 小时前
Flutter 聊天界面使用ListView的reverse:true,导致条目太少的时候会从下往上显示,导致顶部大片空白
flutter
汤面不加鱼丸9 小时前
flutter实践:混合app在部分android旧机型上显示异常
android·flutter
火柴就是我10 小时前
flutter 为什么大家说不能在initState 方法中调用dependOnInheritedWidgetOfExactType
flutter
程序员老刘1 天前
4:2:1!老刘的三季度项目报告
flutter·harmonyos·客户端
达达尼昂1 天前
🎯 Flutter 拖拽选择组件:flutter_drag_selector —— 像选文件一样选择列表项
前端·flutter
QuantumLeap丶1 天前
《Flutter全栈开发实战指南:从零到高级》- 15 -本地数据存储
flutter·ios·dart
法的空间1 天前
让 Flutter 资源管理更智能
android·flutter·ios
江上清风山间明月2 天前
Flutter中Column中使用ListView时溢出问题的解决方法
android·flutter·column·listview