Golang中Protobuf的紧耦合问题探讨

Golang中Protobuf的紧耦合问题探讨 大家好,

项目A与项目B通过protobuf进行通信(双向通信)。每当我进行修改时,都需要重新生成protobuf结构体,只要A和B在同一个代码仓库中,这工作得很好。

如何将这两个项目分离到两个不同的代码仓库中?关于这个问题有什么共识吗?我不想每次修改时都不得不提交3次(到3个不同的仓库)。

请帮帮我,我急需找到一个解决方案。

2 回复

协议已为此做好准备! 请仔细阅读:

Google Developers

Google Developers

语言指南 (proto3) | Protocol Buffers | Google…

更多关于Golang中Protobuf的紧耦合问题探讨的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


一种常见的解决方案是将Protobuf定义文件单独存放在独立的仓库中,作为共享的协议仓库。这样,项目A和项目B都可以通过引用这个协议仓库来获取最新的Protobuf定义,而无需在各自仓库中重复提交修改。

具体步骤如下:

  1. 创建一个独立的Git仓库(例如myproject-protos),专门存放.proto文件。
  2. 在项目A和项目B中,通过Git子模块(submodule)或Go模块(module)引用协议仓库。
  3. 在构建过程中,从协议仓库获取最新的.proto文件,并生成对应的Go代码。

示例:使用Go模块引用协议仓库

假设协议仓库的路径为github.com/yourname/myproject-protos,你可以在项目A和项目B的go.mod文件中添加对该仓库的引用:

// go.mod
module github.com/yourname/project-a

go 1.21

require github.com/yourname/myproject-protos v0.1.0

在协议仓库中,你可以使用protoc工具生成Go代码,并将生成的代码也提交到协议仓库中。这样,项目A和项目B只需要更新协议仓库的版本即可获取最新的结构体。

示例:使用Git子模块

在项目A和项目B中,将协议仓库添加为子模块:

# 在项目A根目录执行
git submodule add https://github.com/yourname/myproject-protos protos

之后,你可以在项目A和项目B中通过相对路径引用.proto文件,并在构建脚本中生成Go代码。

示例:使用Makefile自动生成代码

在项目A和项目B中,可以创建一个Makefile,自动从协议仓库拉取最新的.proto文件并生成Go代码:

.PHONY: gen-proto

gen-proto:
    # 更新子模块(如果使用子模块)
    git submodule update --init --recursive
    # 使用protoc生成Go代码
    protoc -I=./protos --go_out=./internal/pb ./protos/*.proto

这样,每次修改协议后,只需要在协议仓库提交一次,然后在项目A和项目B中运行make gen-proto即可更新生成的代码。

示例:使用Go Generate

在项目A和项目B的Go代码中,可以使用go:generate指令来自动生成代码。在某个Go文件中添加:

//go:generate protoc -I=../myproject-protos --go_out=./internal/pb ../myproject-protos/*.proto

然后运行go generate ./...即可生成最新的Go代码。

通过以上方法,你可以将Protobuf定义与具体项目解耦,避免多次提交,同时保持项目A和B的独立性。

回到顶部