天天看點

windows系統安裝protocol buffer如何解決protoc-gen-go依賴包安裝的一系列問題

今天在學習 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
           

大功告成!!!!

繼續閱讀