proto编译组件使用
proto编译组件使用
前提:所有组件已经安装好,包括:
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文件。
4. 总结
至此,三个文件都已经成功生成了,整理下目录文件,如下:
.
├── hello.pb.go
├── hello.pb.gw.go
├── hello.proto
└── hello.swagger.json
其中踩了好几个坑:
google/api/annotations.proto怎么解决- proto引入外部proto文件怎么处理
- gateway生成失败报错
虽然还有些地方没弄清楚,但好歹都解决了,记录一下供学习。
proto编译组件使用的更多相关文章
- Java 动态编译组件 & 类动态加载
1.JDK6 动态编译组件 Java SE 6 之后自身集成了运行时编译的组件:javax.tools,存放在 tools.jar 包里,可以实现 Java 源代码编译,帮助扩展静态应用程序.该包中提 ...
- 编译 proto 文件到指定语言的代码
由于 Protocol Buffers 3 的正式版还没有发布,在官网(https://developers.google.com/protocol-buffers/docs/downloads)目前 ...
- 编译树莓派2代B型OpenWrt固件实现无线路由器及nodogsplash认证功能
最终功能: 无线路由器的主要功能,网口WAN接入,USB无线网卡AP热点输出,连上wifi之后跳转到认证页面,点击认证方可上网,有效时间10分钟,认证成功之后自动访问指定网址. 文章结尾有编译好的刷机 ...
- Vue.js——60分钟组件快速入门(下篇)
概述 上一篇我们重点介绍了组件的创建.注册和使用,熟练这几个步骤将有助于深入组件的开发.另外,在子组件中定义props,可以让父组件的数据传递下来,这就好比子组件告诉父组件:"嘿,老哥,我开 ...
- 玩转动态编译 - 高级篇:一,IL访问静态属性和字段
IL介绍 通用中间语言(Common Intermediate Language,简称CIL,发音为"sill"或"kill")是一种属于通用语言架构和.NET ...
- 为Node.js编写组件的几种方式
本文主要备忘为Node.js编写组件的三种实现:纯js实现.v8 API实现(同步&异步).借助swig框架实现. 关键字:Node.js.C++.v8.swig.异步.回调. 简介 首先介绍 ...
- Android 开发环境搭建以及编译
两种搭建编译环境的方式,一种方法是用户安装虚拟机,然后安装基础的Ubuntu12.04.2 系统,利用提供的工具和详细的使用步骤,搭建编译环境:另外一种方法是用户安装虚拟机,然后直接加载 “搭建好的U ...
- Win10上编译CoreCLR的Windows和Linux版本
一.编译环境 首先,不管是Windows还是Linux版本CoreCLR的编译,都是在Windows10上进行的. 二.CoreCLR for Windows 在Windows上做编译怎么能少得了Vi ...
- vue.js学习之组件(下篇)
本文的Demo和源代码已放到GitHub,如果您觉得本篇内容不错,请点个赞,或在GitHub上加个星星! https://github.com/zwl-jasmine95/Vue_test 以下所有知 ...
随机推荐
- 【记录一个问题】运算迁移到gpu后的计时问题
我把部分计算迁移到GPU后,发现以帧率计算的程序,帧率下降:但是看各个函数的时间,又比之前减少了. 很奇怪,既然各个函数的时间减少,为什么帧率反而下降? 原来计算帧率使用了 gettimeofday( ...
- Cesium中级教程4 - 空间数据可视化(二)
Cesium中文网:http://cesiumcn.org/ | 国内快速访问:http://cesium.coinidea.com/ Viewer中的Entity功能 让我们看看Viewer为操作e ...
- Node内部架构图
1.Node内部架构图 先来看一下Node节点的内部实现架构图. 首先最上层入口是Restful风格和javaTcp风格的API入口,RestFul请求映射到处理器RestControl.JavaAp ...
- k8s 基于RBAC的认证、授权介绍和实践
在K8S中,当我们试图通过API与集群资源交互时,必定经过集群资源管理对象入口kube-apiserver.显然不是随随便便来一个请求它都欢迎的,每个请求都需要经过合规检查,包括Authenticat ...
- SaltStack 的基本概念与工作原理 架构设计
随着云计算技术的快速普及与发展,越来越多的企业开始学习和搭建自己的云平台代替传统的 IT 交付模式,企业的 IT 环境也随之越来越复杂,常规的运维方法与技术已经无法满足现在云环境中系统的配置与变更.基 ...
- python06day
Now代码1005行 回顾 字典的初识 查询速度快,{'name':'tangdaren'},存储大量关联型数据 键:int.str(bool tuple不常用)不可变的数据类型 值:任意数据类型 3 ...
- Java 基础02
参照:https://www.cnblogs.com/ZXF6/p/11530009.html 类和对象 /** * java 中的类和对象 * * 一.局部变量的作用域. * * 二.面向对象的概述 ...
- poj_3190
首先把所有的牛排个序,优先按照起始时间 其次建立一个堆,重载小于号(只可以重载小于号),优先按照右端点的时间排序,大的放下面(sort的时候会放后面),堆顶是结束时间最快的 #include < ...
- 连接mysql出现“Unable to load authentication plugin 'caching_sha2_password”错误
这是mysql 8.0版本才出现的问题,原因是mysql 8.0 默认使用 caching_sha2_password 身份验证机制 -- 从原来的 mysql_native_password 更改为 ...
- web容器、sevlet容器、spring容器、springmvc容器之间的关系
原文链接:http://www.cnblogs.com/jieerma666/p/10805966.html https://blog.csdn.net/zhanglf02/article/detai ...