如何借助Go依赖编译Go项目(Cortex)中的Protobuf文件
解决Go项目Protobuf文件依赖问题并生成Python类
方法一:利用Go模块获取依赖路径并传递给protoc
Go模块拉取的依赖会存放在带有版本标签的目录中,protoc无法直接识别这种路径结构,你可以通过go list命令获取依赖的实际文件系统路径,再将其加入protoc的导入路径参数:
- 获取gogo/protobuf相关依赖的绝对路径:
# 获取gogoproto目录的路径 GOGO_PROTO_PATH=$(go list -f '{{.Dir}}' github.com/gogo/protobuf/gogoproto) # 获取gogo/protobuf根目录的路径(包含其他可能的子依赖) GOGO_ROOT=$(go list -f '{{.Dir}}' github.com/gogo/protobuf)
- 执行protoc命令,将这些路径和当前目录一起作为导入路径:
protoc -I=. -I="$GOGO_ROOT" -I="$GOGO_PROTO_PATH" --python_out=target cortex.proto
这样protoc就能找到gogo.proto以及其他依赖的proto文件。
方法二:使用Go Vendor统一管理依赖
如果觉得路径参数太繁琐,可以用Go的vendor功能把所有依赖复制到项目目录下,让protoc能直接识别标准的导入路径:
- 临时初始化Go模块(如果当前目录还没有
go.mod):
go mod init temp-proto-project
- 拉取所需依赖并生成vendor目录:
go get github.com/gogo/protobuf@v1.3.2 go mod vendor
- 基于vendor目录执行protoc命令:
protoc -I=. -I=vendor --python_out=target cortex.proto
vendor目录里会包含完整的依赖文件结构,protoc可以直接通过导入路径找到对应的proto文件。
关键说明
Go模块的pkg/mod目录中,依赖包带有版本标签(如@v1.3.2),这会导致protoc无法匹配github.com/gogo/protobuf/gogoproto/gogo.proto这种导入路径——因为实际文件路径是github.com/gogo/protobuf@v1.3.2/gogoproto/gogo.proto。上述两种方法本质都是让protoc能找到这些带版本标签的目录,或者将依赖复制到不带版本标签的结构中。
内容的提问来源于stack exchange,提问作者Philip Couling
相关产品推荐
相关产品推荐

