欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

如何使用proto組件編譯pb.go文件

 更新時間:2023年10月13日 11:31:45   作者:Yisany  
這篇文章主要介紹了如何使用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ù)引入相關(guān)的依賴,例如這里的google/api/annotations.proto

protoc -I ./ -I $GOPATH/src -I $GOPATH/src/google/api --go_out=plugins=grpc:.

第一個-I

引入當前目錄(因為要用hello.proto);

第二個-I

引入go的相關(guān)依賴;

第三個-I

引入annotations.proto這個文件,使用的前提是$GOPATN/src下已經(jīng)準備好了相關(guān)的包;

完整命令:

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ù),這里設(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)容,更多關(guān)于go proto編譯組件的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • golang中package?is?not?in?GOROOT報錯的真正解決辦法

    golang中package?is?not?in?GOROOT報錯的真正解決辦法

    這篇文章主要給大家介紹了關(guān)于golang中package?is?not?in?GOROOT報錯的真正解決辦法,文中通過圖文介紹的非常詳細,對同樣遇到這個問題的朋友具有一定的參考學習價值,需要的朋友可以參考下
    2023-03-03
  • Gin+Gorm實現(xiàn)CRUD的實戰(zhàn)

    Gin+Gorm實現(xiàn)CRUD的實戰(zhàn)

    本文主要介紹了Gin+Gorm實現(xiàn)CRUD的實戰(zhàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-02-02
  • go slice 擴容實現(xiàn)原理源碼解析

    go slice 擴容實現(xiàn)原理源碼解析

    這篇文章主要為大家介紹了go slice 擴容實現(xiàn)原理源碼解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-01-01
  • Golang中四種gRPC模式舉例詳解

    Golang中四種gRPC模式舉例詳解

    gRPC是一種進程間通信技術(shù),在微服務(wù)和云原生領(lǐng)域都有著廣泛的應(yīng)用,下面這篇文章主要給大家介紹了關(guān)于Golang中四種gRPC模式的相關(guān)資料,文中通過代碼介紹的非常詳細,需要的朋友可以參考下
    2024-03-03
  • 最新評論