编译器protoc
GitHub - protocolbuffers/protobuf: Protocol Buffers - Google's data interchange format
Go support for Protocol Buffers
第二个大版本
GitHub - protocolbuffers/protobuf-go: Go support for Google's protocol buffers
对应的模块名module google.golang.org/protobuf
包含两部分
1代码生成 protoc-gen-go tool
2运行时库
第一个大版本
GitHub - golang/protobuf: Go support for Google's protocol buffers
module github.com/golang/protobuf
安装
protoc编译器
https://github.com/protocolbuffers/protobuf/releases
go install google.golang.org/protobuf/cmd/protoc-gen-go@latest
go install google.golang.org/grpc/cmd/protoc-gen-go-grpc@latest
protoc代码生成
命令
protoc --proto_path=IMPORT_PATH --cpp_out=DST_DIR --java_out=DST_DIR --python_out=DST_DIR --go_out=DST_DIR --ruby_out=DST_DIR --objc_out=DST_DIR --csharp_out=DST_DIR path/to/file.proto
package
.proto文件生成的go代码所在的package有两种方式设置,两种方式同时存在,以命令行参数为准
- .proto文件内部option go_package=”a/b/c/d”
- protoc命令行参数 --go_opt=M.proto文件相对路径=包路径,例如--go_opt=Mprotos/buzz.proto=example.com/project/protos/fizz
import
.proto内部的import “a/b/c/d.proto”;当前proto文件引用其他proto文件的定义时,这个路径是相对于protoc工作目录的,不是相对于当前proto文件
--proto_path或-I参数
指定搜索导入的目录,可以有多次,按顺序搜索。如果不指定这个参数,默认为当前工作目录,有了这个在.proto内部 import其他.proto时可以只写文件名不带繁琐的相对路径。一般来说把-I/--proto_path设置为工程根目录,所有.proto导入都相对根目录比较好
--go_out参数
指定生成代码的目录,这个目录必须存在,相对于protoc的工作目录,生成代码的包路径以这个目录为base,包的子目录会自动生成。
生成go文件的路径
由--go_out参数和--go_opt决定
--go_opt定义三种输出文件模式,都是以go_out为准且go_out是相对于protoc的工作目录,然后三种模式决定了子目录的来源
--go_opt=paths=source_relative 最终路径go_out参数路径+命令行.proto文件路径 例如--go_out=a 命令行b/*.proto 那么最终路径 a/b
--go_opt=paths=import 最终路径go_out参数路径+.proto里面定义的option go_package路径 例如--go_out=a 且.proto文件option go_package=”b/c/d” 那么最终路径 a/b/c/d
--go_opt=module=$PREFIX 最终路径go_out参数路径+.proto里面定义的option go_package路径去掉PREFIX ,例如--go_out=a 且.proto文件option go_package=”b/c/d”且 PREFIX=b/c 那么最终路径 a/d
注意
.proto内部的"package 包名;"这个指令 是protobuff名字空间,跟生成的go代码的package无关
.proto内部的import 导入的是引用的.proto文件,跟go的import无关