如何使用proto組件編譯pb.go文件
前提
所有組件已經(jīng)安裝好,包括:
protoc
protoc-gen-go
protoc-gen-grpc-gateway
protoc-gen-swagger
怎么裝再開一篇
分為三個部分:
- 編譯pb.go
- 編譯pb.gw.go
- 編譯swagger.json
首先準備hello.proto文件
syntax = "proto3"; package hello; import "google/api/annotations.proto"; service HelloWorld { rpc SayHelloWorld(HelloWorldRequest) returns (HelloWorldResponse) { option (google.api.http) = { post: "/hello_world" body: "*" }; } } message HelloWorldRequest { string referer = 1; } message HelloWorldResponse { string message = 1;
1. 編譯pb.go文件
需要使用protoc-gen-go
組件,命令:
protoc --go_out=plugins=grpc:. ${xxx.proto}
注意要用-I
參數(shù)引入相關的依賴,例如這里的google/api/annotations.proto
:
protoc -I ./ -I $GOPATH/src -I $GOPATH/src/google/api --go_out=plugins=grpc:.
第一個-I
引入當前目錄(因為要用hello.proto
);
第二個-I
引入go的相關依賴;
第三個-I
引入annotations.proto
這個文件,使用的前提是$GOPATN/src
下已經(jīng)準備好了相關的包;
完整命令:
protoc -I ./ -I $GOPATH/src -I $GOPATH/src/google/api --go_out=plugins=grpc:. ./hello.proto
輸出:
$ protoc -I ./ -I $GOPATH/src -I $GOPATH/src/google/api --go_out=plugins=grpc:. ./hello.proto
protoc-gen-go: unable to determine Go import path for "hello.proto"
Please specify either:
• a "go_package" option in the .proto source file, or
• a "M" argument on the command line.
See https://developers.google.com/protocol-buffers/docs/reference/go-generated#package for more information.
--go_out: protoc-gen-go: Plugin failed with status code 1.
看輸出需要在hello.proto
文件中指定go_package
參數(shù),這里設置為當前目錄,更新下hello.proto
內(nèi)容:
syntax = "proto3"; package hello; option go_package="./"; import "google/api/annotations.proto"; service HelloWorld { rpc SayHelloWorld(HelloWorldRequest) returns (HelloWorldResponse) { option (google.api.http) = { post: "/hello_world" body: "*" }; } } message HelloWorldRequest { string referer = 1; } message HelloWorldResponse { string message = 1; }
再次編譯,成功生成hello.pb.go
文件。
2. 編譯pb.gw.go文件
需要使用protoc-gen-grpc-gateway
組件,命令:
protoc -I ./ -I $GOPATH/src -I $GOPATH/src/google/api --grpc-gateway_out=logtostderr=true:.
運行:
protoc -I ./ -I $GOPATH/src -I $GOPATH/src/google/api --grpc-gateway_out=logtostderr=true:. ./hello.proto
這時候命令行會輸出一大串東西,生成文件失敗,并且在最后標注了:
...
--grpc-gateway_out: 11:1: expected 'IDENT', found 'import'
試了很多方法,最后發(fā)現(xiàn),go_package
參數(shù)不能寫./
,要加上后綴包名,例如改成./hello
,不知道真正的原因是不是這個,但這樣改了以后編譯通過了。
這時候完整的hello.proto
如下:
syntax = "proto3"; package hello; option go_package="./hello"; import "google/api/annotations.proto"; service HelloWorld { rpc SayHelloWorld(HelloWorldRequest) returns (HelloWorldResponse) { option (google.api.http) = { post: "/hello_world" body: "*" }; } } message HelloWorldRequest { string referer = 1; } message HelloWorldResponse { string message = 1; }
重新運行上面的命令,成功生成 hello.pb.gw.go
文件,此時目錄如下:
.
├── hello
│ └── hello.pb.gw.go
├── hello.pb.go
└── hello.proto
3. 編譯swagger.json文件
需要使用protoc-gen-swagger
組件,命令:
protoc -I ./ -I $GOPATH/src -I $GOPATH/src/google/api --swagger_out=logtostderr=true:.
運行:
protoc -I ./ -I $GOPATH/src -I $GOPATH/src/google/api --swagger_out=logtostderr=true:. ./hello.proto
變成成功,生成hello.swagger.json
文件。
總結(jié)
至此,三個文件都已經(jīng)成功生成了,整理下目錄文件,如下:
.
├── hello.pb.go
├── hello.pb.gw.go
├── hello.proto
└── hello.swagger.json
其中踩了好幾個坑:
- google/api/annotations.proto怎么解決
- proto引入外部proto文件怎么處理
- gateway生成失敗報錯
雖然還有些地方?jīng)]弄清楚,但好歹都解決了,記錄一下供學習。
以上就是如何使用proto組件編譯pb.go文件的詳細內(nèi)容,更多關于go proto編譯組件的資料請關注腳本之家其它相關文章!
相關文章
Golang?統(tǒng)計字符串中數(shù)字字母數(shù)量的實現(xiàn)方法
這篇文章主要介紹了Golang?統(tǒng)計字符串中數(shù)字字母數(shù)量,本文給出了兩種從字符串獲取數(shù)字與字母數(shù)量的方法,分別是ASCII 碼值和正則表達式,需要的朋友可以參考下2022-06-06golang RWMutex讀寫鎖實現(xiàn)讀共享寫獨占的功能示例
在 Go 里除了互斥鎖外,還有讀寫鎖 RWMutex,它主要用來實現(xiàn)讀共享,寫獨占的功能,今天我們也順便分析下讀寫鎖,加深對 Go 鎖的理解2023-09-09golang中package?is?not?in?GOROOT報錯的真正解決辦法
這篇文章主要給大家介紹了關于golang中package?is?not?in?GOROOT報錯的真正解決辦法,文中通過圖文介紹的非常詳細,對同樣遇到這個問題的朋友具有一定的參考學習價值,需要的朋友可以參考下2023-03-03