安裝 protoc
-
下載 protoc-3.11.2-win64.zip 壓縮包
-
將文件解壓到某一文件夾。 如:
C:\soft\protoc
-
將解壓出來的文件夾下的
C:\soft\protoc\bin
目錄配置到 PATH 環境變量下
安裝protobuf的編譯器protoc-參考
window:
- 下載: protoc-3.3.0-win32.zip
- 解壓,把bin目錄下的protoc.exe複製到GOPATH/bin下,GOPATH/bin加入環境變量。
- 當然也可放在其他目錄,需加入環境變量,能讓系統找到protoc.exe
linux: - 下載:protoc-3.3.0-linux-x86_64.zip 或 protoc-3.3.0-linux-x86_32.zip
- 解壓,把bin目錄下的protoc複製到GOPATH/bin下,GOPATH/bin加入環境變量。
- 如果喜歡編譯安裝的,也可下載源碼自行安裝,最後將可執行文件加入環境變量。
安裝 protoc-gen-go
- 在終端直接執行
go get -u github.com/golang/protobuf/protoc-gen-go
,可以在你的%GOPATH%/bin路徑下找到一個 protoc-gen-go.exe - 如:
$GOPATH=C:\Users\answer\go\
common.ptoto
syntax = "proto3";
message Response {
// 狀態編碼
int32 code = 1;
// 狀態編碼具體錯誤描述
string message = 2;
// 返回數據
bytes result = 3;
}
# 進入對應的目錄執行以下命令生成 common.ptoto.pb.go 文件
protoc.exe --go_out=./ common.ptoto
# 或使用以下命令
protoc --plugin=protoc-gen-go=C:\Users\answer\go\bin\protoc-gen-go.exe --go_out=./ common.proto
錯誤分析
# 執行 protoc.exe --go_out=./ common.ptoto 報錯, 錯誤描述
--go_out: protoc-gen-go: Plugin failed with status code 1.
# 解決方案
go get -u github.com/golang/protobuf/protoc-gen-go
undefined: proto.ProtoPackageIsVersion3
undefined: proto.ProtoPackageIsVersion3
# 通過 go get -u google.golang.org/grpc 安裝的 protoc-gen-go版本永遠是最新的(支持v3)
# 而使用grpc教程 demo 用的包是 protoc-gen-go v1.2.0 版本 (不支持v3 )
GIT_TAG="v1.2.0" # change as needed
go get -d -u github.com/golang/protobuf/protoc-gen-go
# 切換到 1.2.0 分支
git -C "$(go env GOPATH)"/src/github.com/golang/protobuf checkout $GIT_TAG
go install github.com/golang/protobuf/protoc-gen-go
undefined: proto.InternalMessageInfo
undefined: proto.InternalMessageInfo
# 原因: 新的版本加入了InternalMessageInfo導致編譯不過
# 解決方案1、
# 1. 使用舊版本的插件,即手動下載並安裝protoc-gen-go版本v1.1.0 (https://github.com/golang/protobuf/releases/tag/v1.2.0)來生成舊風格的原型代碼。
# 下載文件
https://github.com/golang/protobuf/archive/v1.2.0.zip
# 解壓, tar包方式: tar zxvf protobuf-1.2.0.tar.gz
# 進入到源碼的 protoc-gen-go 目錄
cd protobuf-1.2.0/protoc-gen-go
# 重新編譯
go build
# 將生成的protoc-gen-go放入$GOROOT/bin目錄下,重新編譯protobuf文件
protoc xxx.proto --go_out=.
# 重新編譯項目,問題解決
# C:\Users\answer\go\src\github.com\golang\protobuf $GOPATH\src\github.com\golang\protobuf
# 解決方案2
# 1. 使用正確的依賴版本:您的項目依賴項中應該有github.com/golang/protobuf 目錄,
# 2. 將其替換爲最新版本(v1.2.0),下載地址:https://github.com/golang/protobuf/releases,
# 3. 即將下載的目錄替換項目中的github.com/golang/protobuf目錄,問題解決。
# 刪除生成的 ***.ptoto.pb.go 文件中的 XXX*** 字段和方法