本章主要介绍了如何在 proto 文件中引入其他 proto 文件。

1. 概述

Protocol buffers 是一种语言无关、平台无关的可扩展机制或者说是数据交换格式,用于序列化结构化数据。与 XML、JSON 相比,Protocol buffers 序列化后的码流更小、速度更快、操作更简单。

Protocol buffers are a language-neutral, platform-neutral extensible mechanism for serializing structured data.

2. 详解

基本定义

一个简单的 protobuf 文件定义如下:

syntax = "proto3";
option go_package = "protobuf/import;proto";
package import;message Computer {string name = 1;
}

syntax = “proto3”;—指定使用 proto3 语法

option go_package = “protobuf/import;proto”;—前一个参数用于指定生成文件的位置,后一个参数指定生成的 .go 文件的 package 。具体语法如下:

option go_package = "{out_path};out_go_package";

注意:这里指定的 out_path 并不是绝对路径,只是相对路径或者说只是路径的一部分,和 protoc 的 --go_out 拼接后才是完整的路径。

也使用--go_opt=paths=source_relative直接指定 protoc 中 指定的是绝对路径,这样就不会去管 protobuf 文件中指定的路径。

package import;—表示当前 protobuf 文件属于 import包,这个package不是 Go 语言中的那个package。

这个 package 主要在导入外部 proto 文件时用到。

导入其他proto文件

要导入其他 proto 文件只需要使用import键字,具体如下:

import "protobuf/import/component.proto";

导入后则通过被导入文件包名.结构体名使用。

component.proto 文件中 package 指定为 import,所以这里通过 import.CPU 和 import.Memory 语法进行引用。

完整代码如下:

syntax = "proto3";
option go_package = "protobuf/import;proto";
package import;
import "protobuf/import/component.proto";message Computer {string name = 1;import.CPU cpu = 2;import.Memory memory = 3;
}

导入 compoent.proto 文件,这个也是相对路径,具体和 protoc –proto_path 组合起来才是完整路径。

一般指定为项目根目录的次一级目录,编译的时候直接在根目录编译。

protoc 编译的时候通过 --proto_path 指定在哪个目录去寻找 import 指定的文件。

比如指定 --proto_path=.即表示在当前目录下去寻找protobuf/import/compoent.proto这个文件。

3. 完整例子

目录结构如下

lixd@17x:~/17x/projects/grpc-go-example$ tree
├── protobuf
│   │
│   └── import
│       ├── compoent.proto
│       └── computer.proto
└── README.md

component.proto

syntax = "proto3";
option go_package = "protobuf/import;proto";
package import;message CPU {string Name = 1;int64 Frequency = 2;
}
message Memory {string Name = 1;int64 Cap = 2;
}

computer.proto

syntax = "proto3";
option go_package = "protobuf/import;proto";
package import;
import "protobuf/import/component.proto";message Computer {string name = 1;import.CPU cpu = 2;import.Memory memory = 3;
}

protoc 编译

项目根路径(grpc-go-example)下进行编译

lixd@17x:~/17x/projects/grpc-go-example$ protoc --proto_path=. --go_out=. ./protobuf/import/*.proto

参数详解:

1)–proto_path=.

指定在当前目录( grpc-go-example)寻找 import 的文件(默认值也是当前目录)

然后 protobuf 文件中的 import 路径如下

import "protobuf/import/component.proto";

所以最终会去找 grpc-go-example/protobuf/import/component.proto

--proto_pathimport是可以互相调整的,只需要能找到就行。

建议protoc参数 –proto_path 指定为根目录,proto文件中的import 则从根目录次一级目录开始。

2)–go_out=.

指定将生成文件放在当前目录( grpc-go-example),同时因为 proto 文件中也指定了目录为protobuf/import,具体如下:

option go_package = "protobuf/import;proto";

所以最终生成目录为--go_out+go_package= grpc-go-example/protobuf/import

可以通过参数 --go_opt=paths=source_relative 来指定使用绝对路径,从而忽略掉 proto 文件中的 go_package 路径,直接生成在 –go_out 指定的路径。

3)./protobuf/import/*.proto

指定编译 import 目录下的所有 proto 文件,由于有文件的引入所以需要一起编译才能生效。

当然也可以一个一个编译,只要把相关文件都编译好即可。

Test

func Print() {c := Computer{Name: "alienware",Cpu: &CPU{Name:      "intel",Frequency: 4096,},Memory: &Memory{Name: "芝奇",Cap:  8192,},}fmt.Println(c.String())
}

4. 小结

  • 1)通过import "{path}"; 命令引入;
  • 2)导入后通过被导入文件包名.结构体名方式使用;
  • 3)编译时通过--proto_path=. 指定寻找proto文件的目录,一起编译。

protobuf教程(一)---引入其他proto文件相关推荐

  1. protobuf根据有关联的.proto文件进行编译

    环境:Goland 使用默认的Goland的protobuf的插件. base.proto: syntax = "proto3";option go_package = " ...

  2. Caffe源码中caffe.proto文件分析

    Caffe源码(caffe version:09868ac , date: 2015.08.15)中有一些重要文件,这里介绍下caffe.proto文件. 在src/caffe/proto目录下有一个 ...

  3. protobuf引入不同包下的proto文件

    解决两个问题: 1.两个proto文件存放路径不同 2.两个proto的package不同 比如现在有个RankInfoRes.proto文件,它的package是: com.road.ddt.pro ...

  4. Protobuf之proto文件编写规则

    一. 简单介绍 protobuf文件:就是定义你要的消息(类似java中的类)和消息中的各个字段及其数据类型(类似java类中的成员变量和他的数据类型) 二. Protobuf消息定义 1.消息由至少 ...

  5. protobuf java 编译_Maven项目中,编译proto文件成Java类

    新建Maven项目 新建一个 Maven 项目: pom定义了最小的maven2元素,即:groupId,artifactId,version. groupId:项目或者组织的唯一标志,并且配置时生成 ...

  6. pip 安装protobuf_Python3.6安装protobuf模块+将proto文件转换成pb2.py文件

    Python对版本的对应即为苛刻,笔者第一次安装时遇到了很多坑,比如无法将proto文件转换成py文件,转换了之后文件无法使用,网上各种各样的解决办法都没有讲到重点.其实会出现各种各样的问题是由于版本 ...

  7. Cocos Creator TypeScript 中使用ProtoBuf(利用工具把proto文件生成对应的js文件以及ts文件)

    我是一枚刚入坑cocos的小白o(╯□╰)o 开发环境:Cocos Creator 1.9   (需要安装Node.js,使用npm命令) 在网上找了很久都是讲的protobuf.js的用法,但是没有 ...

  8. Protobuf 学习(二)编译proto文件并测试

    Google 官网上的一个典型例子 (1)定义 proto 文件 // addressbook.protopackage tutorial; // package声明符message Person { ...

  9. 【Protobuf速成指南】.proto文件的编写与编译

    文章目录 1.0版本 一.编写.proto文件 1.文件规范: 2.注释方式: 3.指定proto3语法: 4.package申明符 5.定义message 6.编写消息字段 ①类型对照表 ②唯一编号 ...

最新文章

  1. docker (centOS 7) 使用笔记4 - etcd服务
  2. 计算机二级access选择题题库_资料最新计算机二级题库,选择题资料汇总+全真试题分享(Office)...
  3. kafka管理神器-kafkamanager
  4. applicationcontext理解使用
  5. 海康、大华IPC的rtsp格式
  6. 逆袭之旅.DAY08东软实训.多态~
  7. pdu报头内容_1OSI七层参考模型,各个报头内容
  8. 浏览器的“sleep”
  9. 项目管理实践_8Manage:保险行业的项目管理实践
  10. 制作img镜像文件的5种方法
  11. C#【高级篇】 IntPtr是什么?怎么用?
  12. 数学魔鬼表达式——第二天
  13. 红米pro android o刷机,红米Pro官方卡刷机教程 怎么刷机
  14. 如何在手机浏览器中实现条形码/QR码扫描
  15. Rhino6.25软件安装教程|兼容WIN10
  16. 【技术贴】自己制作支持QQ空间背景音乐的链接教程||QQ免费空间音乐外链自己上传制作教程...
  17. 00_51入门知识积累__常用工具(二)
  18. 第一章 JSON语法用法
  19. DanmuPlayer插件获取数据库弹幕——ssm弹幕应用
  20. 一口气搞懂「Flink Metrics」监控指标和性能优化,全靠这33张图和7千字(建议收藏)

热门文章

  1. java输入输出语句_Java中的常用输入输出语句的操作代码
  2. 移动开发技术一:微信门户界面设计
  3. 渗透测试-渗透测试常见的总结
  4. java后台正则表达式验证多种方法--(港澳证件验证)
  5. 4个方法快速打造你的阅读清单
  6. mysql 查询树形结构_MySql/Oracle树形结构查询
  7. Mooo Moo题解
  8. 记一次API 接口定义 添加 @ApiOperation 注解触发中间件 bug 问题分析
  9. 人脸识别之Hog特征+SVM分类器训练与使用
  10. QT自定义Tab标签页,可以删除、添加、修改和选中