如何使用proto组件编译pb.go文件

 更新时间:2023年10月13日 11:31:45   作者:Yisany  
这篇文章主要介绍了如何使用proto组件编译pb.go文件的详细过程详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

前提

所有组件已经安装好,包括:

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参数引入相关的依赖,例如这里的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下已经准备好了相关的包;

完整命令:

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参数,这里设置为当前目录,更新下hello.proto内容:

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'

试了很多方法,最后发现,go_package参数不能写./,要加上后缀包名,例如改成./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文件。

总结

至此,三个文件都已经成功生成了,整理下目录文件,如下:

.
├── hello.pb.go
├── hello.pb.gw.go
├── hello.proto
└── hello.swagger.json

其中踩了好几个坑:

  • google/api/annotations.proto怎么解决
  • proto引入外部proto文件怎么处理
  • gateway生成失败报错

虽然还有些地方没弄清楚,但好歹都解决了,记录一下供学习。

以上就是如何使用proto组件编译pb.go文件的详细内容,更多关于go proto编译组件的资料请关注脚本之家其它相关文章!

相关文章

  • go mod包拉不下来的问题及解决方案

    go mod包拉不下来的问题及解决方案

    这篇文章主要介绍了go mod包拉不下来的问题及解决方案,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-09-09
  • 简化Go开发提高生产力的强大工具及使用详解

    简化Go开发提高生产力的强大工具及使用详解

    作为 Go 开发人员,应该都知道维持简洁高效开发工作流程的重要性,为了提高工作效率和代码质量,简化开发流程并自动执行重复性任务至关重要,在本文中,我们将探讨一些强大的工具和技术,它们将简化 Go 开发过程,助力您的编码之旅
    2023-10-10
  • go开发alertmanger实现钉钉报警

    go开发alertmanger实现钉钉报警

    本文主要介绍了go开发alertmanger实现钉钉报警,通过自己的url实现alertmanager的钉钉报警,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-07-07
  • Mac GoLand打不开(闪退)也不报错的解决方案

    Mac GoLand打不开(闪退)也不报错的解决方案

    这篇文章主要介绍了Mac GoLand打不开(闪退)也不报错的解决方案,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-04-04
  • 使用Go语言实现向文件写入内容的示例代码

    使用Go语言实现向文件写入内容的示例代码

    向文件写入内容 的完整内容,这是文件操作的另一个核心技能,与读取配套,适用于日志记录、生成报告、写配置等场景,本文通过代码示例介绍的非常详细,需要的朋友可以参考下
    2025-07-07
  • Golang健康检查接口的实现

    Golang健康检查接口的实现

    本文主要介绍了Golang健康检查接口的实现,包括存活探针和就绪探针的区别,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2026-04-04
  • go-zero服务部署配置及源码解读

    go-zero服务部署配置及源码解读

    这篇文章主要为大家介绍了go-zero服务部署配置及源码解读,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-08-08
  • golang结构化日志slog的用法简介

    golang结构化日志slog的用法简介

    日志是任何软件的重要组成部分,Go 提供了一个内置日志包(slog),在本文中,小编将简单介绍一下slog包的功能以及如何在 Go 应用程序中使用它,感兴趣的可以了解下
    2023-09-09
  • Go语言实现关闭http请求的方式总结

    Go语言实现关闭http请求的方式总结

    面试的时候问到如何关闭http请求,一般人脱口而出的是关闭response.body,这是错误的。本文为大家整理了三个正确关闭http请求的方法,希望对大家有所帮助
    2023-02-02
  • Go无缓冲通道(同步通道)的实现

    Go无缓冲通道(同步通道)的实现

    本文主要介绍了Go无缓冲通道(同步通道)的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2025-02-02

最新评论