如何跨GitHub仓库导入Protobuf并适配下游Go编译流程?
解决Protobuf跨仓库导入依赖及下游编译问题
1. 修正.proto文件的导入与类型引用
首先确保timestamp仓库的timestamp.proto有明确的包定义,示例如下:
syntax = "proto3"; package util.timestamp; option go_package = "github.com/my-user/timestamp"; // 对应timestamp仓库的Go模块路径 message Timestamp { int64 seconds = 1; int32 nanos = 2; }
然后修改api仓库的dto1.proto,正确导入并引用Timestamp类型:
syntax = "proto3"; package api.data; // 导入timestamp仓库的proto文件,编译时需通过--proto_path指定该文件的搜索路径 import "timestamp.proto"; option go_package = "github.com/my-user/api/data"; // 对应api-go仓库的子路径 message DTO1 { string id = 1; // 必须使用完整包名引用,避免类型歧义 util.timestamp.Timestamp timestamp = 2; }
2. 调整编译命令处理跨仓库依赖
编译api仓库的proto时,需要告诉protoc去哪里找到timestamp.proto,推荐通过Go模块管理依赖:
步骤1:在api仓库中添加timestamp依赖
go get github.com/my-user/timestamp@<指定版本号>
步骤2:修改编译命令,添加proto搜索路径
# 获取timestamp仓库在本地模块中的目录路径 TIMESTAMP_PROTO_DIR=$(go list -f '{{.Dir}}' github.com/my-user/timestamp) find $GEN_PROTO_DIR -type f -name "*.proto" -exec protoc \ # 添加timestamp仓库目录到proto搜索路径 --proto_path=$TIMESTAMP_PROTO_DIR \ # 添加当前api仓库根目录作为搜索路径,确保能找到自身的proto文件 --proto_path=. \ --go_out=$GEN_OUT_DIR --go_opt=module=github.com/my-user/api-go \ --go-grpc_out=$GEN_OUT_DIR --go-grpc_opt=module=github.com/my-user/api-go \ --grpc-gateway_out=$GEN_OUT_DIR --grpc-gateway_opt logtostderr=true \ --grpc-gateway_opt paths=source_relative --grpc-gateway_opt generate_unbound_methods=true \{} \;
如果不想用Go模块,也可以将timestamp仓库作为git子模块放到api的third_party/timestamp目录下,然后将--proto_path=third_party/timestamp加入编译命令即可。
3. 确保下游api-go仓库依赖有效
编译生成的Go代码会输出到api-go仓库,需保证该仓库的依赖配置正确:
- 在
api-go仓库的go.mod中添加对timestamp的依赖,版本必须与api编译时使用的版本一致:
go get github.com/my-user/timestamp@<与api仓库一致的版本号>
- 生成的Go代码中会自动引用
github.com/my-user/timestamp,只要api-go的go.mod包含该依赖,就能正常编译运行,不会出现导入失效的问题。
内容的提问来源于stack exchange,提问作者Woody1193
相关产品推荐
相关产品推荐

