栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Go语言

protobuf:protoc生成golang文件

Go语言 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

protobuf:protoc生成golang文件

protoc版本:libprotoc 3.15.6

proto 文件
syntax = "proto3";
package proto;
// option go_package = "./proto";

message ReqHead {
  int32 command_id = 1;
}
message ReqBody {
  string body = 1;
}
message BaseReq {
  ReqHead req_head = 1;
  ReqBody req_body = 2;
}

message BaseResp {
  int32 code = 1;
  string message = 2;
  string body = 3;
}

service RpcService {
  rpc RpcServiceFunc(BaseReq) returns (BaseResp){}
}
单个proto文件&多个proto文件位于同一目录下 文件目录

生成命令

进入proto文件所在的目录,执行命令
protoc --go_out=plugins=grpc:. base.proto
–go_out用于设置所生成的go代码的输出目录,“.”表示当前目录(注意如果在proto文件里指定了option go_out=“path”,最终生成的文件会在./path下)
plugins=grpc 表示需要生成rpc代码,即proto文件中定义的service,默认不会生成
“:” 为参数分隔符,即pulgins=grpc为–go_out=的第一个参数,".“为第二个参数
注意此处如果protoc-gen-go库的版本较高,会出现protoc-gen-go: unable to determine Go import path for “base.proto"报错,解决方式见本文末可能遇到的问题
如果需要生成多个proto文件,直接在base.proto后追加即可,使用空格分隔 生成所有proto文件可以使用”.proto”

多个proto文件位于多目录下 文件目录

只是把base.proto内的service定义移了出来,注意两个proto文件的package参数已经改为了当前目录名

生成命令

进入多目录的上一级目录 (protodemo/proto)
protoc --go_out=plugins=grpc:. --proto_path=./base:./service ./base/base.proto ./service/service.proto
–proto_path 等价于 -I,用于指定源proto文件的位置,多个路径使用冒号分隔,默认为当前路径。因为service.proto引用了其他目录下的proto文件,所以需要指定

PS:此种方式生成文件所在的目录与执行命令的目录和文件中定义的“option go_package”均有联系,建议将生成文件的命令写成脚本。多目录下生成proto文件好像不支持使用go_opt=M{}={}指定多个输出位置(protoc --go_out=plugins=grpc:. --proto_path=./base:./service --go_opt=Mbase/base.proto=./base --go_opt=Mservice/service.proto=./service ./base/base.proto ./service/service.proto),希望路过的大佬可以指点一下。

可能遇到的问题 Question1:a “go_package” option in the .proto source file, or a “M” argument on the command line.

解决方案1:
       在proto文件内使用option go_package = “{paths}”; path的具体路径即为文件生成的路径。
       此方式会影响到proto文件的生成路径,如果仍希望生成的文件目录为执行命令所在的相对路径,可以使用如下命令

进入proto文件所在的目录,执行命令
> protoc --go_out=plugins=grpc:. --go_opt=paths=source_relative base.proto
paths=source_relative会使文件中定义的option go_package定义的路径失效

解决方案2:

进入proto文件所在目录,执行
protoc --go_out=plugins=grpc:. --go_opt=Mbase.proto=./ base.proto
多个文件 protoc --go_out=plugins=grpc:. --go_opt=Mservice.proto=./ service.proto --go_opt=Mbase.proto=./ service.proto base.proto
–go_opt=M{要生成的proto文件相对当前目录全路径}={生成的目标文件所在目录(注意路径至少含有一个/)}
此方案不适用于多个proto文件位于多个目录下的情况,欢迎路过的大佬指导解决办法
PS:发现–go_opt=M{}=./ 时,生成的.pb.go文件的package名为__,引用不到,可以将./替换为"../${pkgName}"解决

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/903742.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号