今天在學習 protocol buffer 的時候遇到了 protoc-gen-go not find 的問題,我是在 windows10 系統中安裝的 protoc ,在官網下載下傳了安裝包(包雖然很小,但是下載下傳是真的慢),然後安裝,以為萬事大吉,結果報依賴的問題,這裡記錄下解決方法,希望對大叫有幫助。
1. 先來看問題
$ protoc --go_out=. hello.proto
'protoc-gen-go' 不是内部或外部指令,也不是可運作的程式
或批處理檔案。
--go_out: protoc-gen-go: Plugin failed with status code 1.
2. 遇到問題第一時間問度娘
找到一篇部落格說,是因為缺少包,那就安裝包。
試了網上的教程:
go get -u github.com/golang/protobuf/protoc-gen-go
但是因為網絡原因失敗了:
$ go get -u github.com/golang/protobuf/protoc-gen-go
# cd C:\GOPATH\src\google.golang.org\protobuf; git pull --ff-only
fatal: unable to access 'https://go.googlesource.com/protobuf/': Failed to connect to go.googlesource.com port 443: Timed out
package google.golang.org/protobuf/compiler/protogen: exit status 1
網上說可以使用 gopm(類似于 npm )指令可以解決此類問題,但是。。。
$ gopm get -g github.com/golang/protobuf/protoc-gen-go
[GOPM] ?[36m08-24 10:08:30?[0m [?[31mERROR?[0m] github.com/golang/protobuf/protoc-gen-go: fail to make request: Get https://gopm.io/api/v1/revision?pkgname=github.com/golang/protobuf: dial tcp: lookup gopm.
io: no such host
我決定放棄了,直接找源碼吧。
3. 編譯源碼
直接通路 Github 上面 protobuf 的源碼,使用 git 下載下傳到本地:
git clone [email protected]:golang/protobuf.git
源碼使用 go module 模式進行的包管理,初始化包名為 github.com/golang/protobuf ,為了友善調用我改成了 myprotobuf ,接着就是
go mod tidy && go mod vendor
下載下傳依賴包了,進入 protoc-gen-go 目錄,很奇怪
github.com/golang/protobuf/internal/gengogrpc
這個包沒有下載下傳下來,但是我發現源碼裡面就有這個包,那就改一下導入包的路徑吧:
myprotobuf/internal/gengogrpc
,問題成功解決。
接下來就是進入
protoc-gen-go
編譯源碼生成可執行檔案了:
[email protected]-wz MINGW64 /d/GOCODE/protobuf/protoc-gen-go (master)
$ go install
很順利,接下來就是測試了。
4. 測試
建立一個 proto 檔案:
syntax = "proto3";
package main;
message String {
string value = 1;
}
生成 go 代碼:
$ protoc --go_out=. hello.proto
$ ls
hello.pb.go hello.proto
大功告成!!!!