参考文章:
- 安装protoc、protoc-gen-go、protoc-gen-go-grpc-CSDN博客
一、简单介绍
本文开发环境,均为 windows 环境,mac 环境其实也类似 ~
① 编译proto文件,相关插件 简单介绍:
- protoc 是编译器,用于将.proto文件编译成代码;
- protoc-gen-go 是一个插件,用于生成Go语言的数据结构代码;
- protoc-gen-go-grpc 是另一个插件,用于生成Go语言的gRPC服务代码。这三个工具共同支持在Go语言环境中使用protobuf和gRPC。
命令示例:protoc --go_out=. --go-grpc_out=. *.proto
在编译.proto
文件时,go_out
和go-grpc_out
这两个参数分别会调用以下文件:
go_out
:这个参数会调用protoc-gen-go
插件。protoc-gen-go
插件的主要作用是将.proto
文件转换为Go语言的代码。生成的文件通常包括消息(message)和枚举(enum)类型的定义,以及序列化和反序列化的方法。go-grpc_out
:这个参数会调用protoc-gen-go-grpc
插件。protoc-gen-go-grpc
插件的主要作用是将.proto
文件中的gRPC服务定义转换为Go语言的代码。生成的文件通常包括gRPC服务接口和客户端存根(client
stub)的定义。 这两个插件通常一起使用,以便在编译.proto
文件时生成完整的Go代码,包括消息类型和gRPC服务接口。
② go get 和 go install 命令的使用场景:
- 当你需要获取一个包的源代码并可能需要对其进行修改时,使用
go get
。- 当你需要编译并安装一个包,以便使用它的可执行文件或库文件时,使用
go install
。
环境:
- go版本:go1.19(注意:go版本过低,可能导致 go install 安装会报错,下面有介绍)
二、安装
建议:虽然有三种方法(github直接下载二进制,使用 go install 安装,手动 git clone 代码并安装),但不同插件安装方法略有不同。
protoc 和 protoc-gen-go 等二进制插件可以通过github来直接下载,而 protoc-gen-go-grpc 则需要通过 go install 安装。
方法一:github直接下载,各插件对应的二进制安装包
参考:安装protoc、protoc-gen-go、protoc-gen-go-grpc-CSDN博客
步骤:github下载对应插件的压缩包,再解压,放在 $GOPATH/bin
目录下即可(需提前配好Go相关环境变量)
protoc 安装:
https://github.com/protocolbuffers/protobuf/releases/tag/v3.19.4(如下图示例:可按需选择对应版本)
解压后,可得到对应系统的可执行文件,如:protoc.exe,将其放在$GOPATH/bin
目录下即可。
检查是否安装成功:protoc --version
protoc-gen-go 安装:
https://github.com/protocolbuffers/protobuf-go/tags
解压后,可得到对应系统的可执行文件,如:protoc-gen-go.exe,将其放在$GOPATH/bin
目录下即可。
检查是否安装成功:protoc-gen-go --version
protoc-gen-go-grpc 安装:
比较特殊,无法直接通过github下载二进制,建议使用 go install 命令安装,也就是方法二:
go install google.golang.org/grpc/cmd/protoc-gen-go-grpc@v1.3.0
最终可得:protoc-gen-go-grpc.exe,将其放在$GOPATH/bin
目录下即可。
检查是否安装成功:protoc-gen-go-grpc --version
方法二:使用Go模块管理工具 (一步到位,但有些依赖可能无法顺利下载,考虑设置GOPROXY)
参考:安装protoc、protoc-gen-go、protoc-gen-go-grpc-CSDN博客
- 安装 protoc
# 根据自己电脑系统,设置对应的GOOS
# windows
go env -w GOOS=windows(设置完之后,记得还原)
# linux
go env -w GOOS=linux(设置完之后,记得还原)
# 二进制 下载链接(可能无法通过go install 安装,直接去github下载二进制即可):
https://github.com/protocolbuffers/protobuf/tags
# 检查是否安装成功
protoc --version
- 安装 protoc-gen-go
go install google.golang.org/protobuf/cmd/protoc-gen-go@v1.31.0
# 检查是否安装成功
protoc-gen-go --version
# 如果下载失败,可以考虑开启代理
go env -w GOPROXY=https://goproxy.cn,direct
如果 go install 报错如下图,可能是因为你的 go 版本过低导致,可以考虑升级 go 版本,比如升级到 go1.19。
- 报错:package google.golang.org/protobuf/cmd/protoc-gen-go@v1.31.0: can only use
path@version syntax with ‘go get’
- 解决:升级 go 版本:https://golang.google.cn/dl/
- 安装 protoc-gen-go-grpc
go install google.golang.org/grpc/cmd/protoc-gen-go-grpc@v1.3.0
// 检查是否安装成功
protoc-gen-go-grpc --version
所有插件安装完后,效果如下:
方法三:手动编译源代码(不推荐,较麻烦,需额外下载源码 编译&安装)
参考:windows安装protoc、protoc-gen-go、protoc-gen-go-grpc-CSDN博客
步骤:
- 下载项目源码:
git clone xxx ...
- 进入项目并安装:执行
go install .
,编译&安装包,生成可执行二进制文件
三、编译 .proto 文件
proto安装好后,尝试编译你定义好的 .proto 文件,命令如下:
protoc --go_out=. --go-grpc_out=. *.proto
--go_out=.
其中的.
是说你要编译的 .proto 文件目录为当前目录,按需修改--go-grpc_out=.
,其中的.
是说你生成 .pb.go 文件的目录,按需修改*.proto
,其中的*
是说编译当前目录下的所有 .proto 文件,也可以单独指定为 xxx.proto 文件
四、错误问题&解决
protoc命令执行过程中,可能会遇到如下错误:
PS D:\Work\Code\Go\src\test\proto> protoc --go_out=.
–go-grpc_out=plugins=grpc:. xxx.proto protoc-gen-go: unable to determine Go import path for “xxx.proto”Please specify either:
• a “go_package” option in the .proto source file, or
• a “M” argument on the command line.
解决方法:
参考:protoc-gen-go: unable to determine Go import path for “*.proto“问题解决-CSDN博客
- 在你的 .proto 文件中,添加如下代码
option go_package = "./";
,具体path可能不同,如图所示:
// helloworld.proto
syntax = "proto3";
package helloworld;
option go_package = "./";
// 定义请求消息
message HelloRequest {
string name = 1;
}
// 定义响应消息
message HelloReply {
string message = 1;
}
// 定义服务
service Greeter {
// 定义SayHello方法
rpc SayHello (HelloRequest) returns (HelloReply);
}
最终效果: