客户端与服务器通信的协议现在大部分都是使用google proto buffer规则,怎么在项目中使用gpb?本文对erlang项目旨在搭建使用gpb依赖,将.proto文件转化为.erl文件进行使用。

一、说明

  • 本文环境:windows、idea、rebar3,搭建可以参考windows下idea使用rebar3
  • rebar3依赖相关文档连接
  • 本文使用的rebar3指令:rebar3 new app name、rebar3 compile、rebar3 shell、rebar3 deps
  • 本文搭建内容为lager依赖后续,继续对test.app进行搭建,目的是使test.app能够使用proto文件

二、添加rebar3_gpb_plugin插件依赖

1、rebar3_gpb_plugin介绍

rebar3_gpb_plugin是用于自动转化使用gpb规则编写的.proto文件的插件,能将.proto文件转化为对应的.erl文件

2、rebar3_gpb_plugin下载

  • reba3_gpb_plugin2.22.4版本地址
  • 下载完压缩包,解压到项目deps文件夹下,改名为rebar3_gpb_plugin

3、rebar3_gpb_plugin依赖项拉取

  • 偷懒方法:用rebar3 deps自动拉取依赖项
  • 1、将rebar3、rebar3.cmd文件拷贝到在deps文件夹下,并创建rebar.config文件
rebar.config文件内容
{erl_opts, [debug_info]}.
{deps, [rebar3_gpb_plugin]}.
  • 2、执行cmd,输入指令rebar3 deps,会生成_build文件夹,依赖项会存放到lib下
E:\test\deps>rebar3 deps
===> Verifying dependencies...
===> Fetching rebar3_gpb_plugin v2.22.1
// 这里download error是因为本地已经有对应tar
===> Download error, using cached file at c:/Users/mechrevo/.cache/rebar3/hex/hexpm/packages/rebar3_gpb_plugin-2.22.1.tar
===> Fetching gpb v4.19.5
===> Download error, using cached file at c:/Users/mechrevo/.cache/rebar3/hex/hexpm/packages/gpb-4.19.5.tar
rebar3_gpb_plugin (pkg source)

  • 3、再将lib下的gpb文件夹复制到deps下,删除_build、rebar.config、rebar3、rebar3.cmd(历史使命)
  • 4、这样rebar3_gpb_plugin的依赖项gpb就下载完毕
  • 手动方法:gpb下载地址,同样解压到deps下,重命名,但是还要对应的添加gpb.vsn文件,里面写上gpb的版本号,修改gpb.app.src中的vsn字段,具体使用说明可以参考gpb使用说明中的Building outside of a git work tree

4、创建protobuff

  • 在apps文件夹下创建protobuff文件夹,打开cmd,执行rebar3 new app protobuff
  • 在protobuff下创建include、proto两个文件夹

5、修改配置

  • 修改protobuff下的rebar.config,这里可以参考rebar3_gpb_plugin的doc下的实例sample_app的rebar.config,rebar.config内的配置可以查看readme.md,主要的配置在下面做了备注
{erl_opts, [debug_info]}.
{deps, []}.{shell, [% {config, "config/sys.config"},{apps, [protobuff]}
]}.{plugins, [{rebar3_gpb_plugin, "2.22.4"} % 插件版本
]}.{gpb_opts, [{i, "proto"},                % proto文件所在的路径{module_name_suffix, "_pb"}, % 每个proto文件生成文件名的后缀{o_erl, "src"},              % 生成.erl文件所在路径{o_hrl, "include"},          % 生成.hrl文件所在路径{strings_as_binaries, true},type_specs]}.{provider_hooks, [{pre, [{compile, {protobuf, compile}},{clean, {protobuf, clean}}]}
]}.
  • 修改项目下的rebar.config
{erl_opts, [debug_info,{i, "./deps/gpb/include"}]}. % 将gpb的include包含,include下有gpb.hrl、gpb_version.hrl两个文件,proto生成.erl文件是需要包含gpb.hrl
{deps, []}.
{checkouts_dir, "deps"}.{relx, [{release,{test, "0.1.0"},[test, {runtime_tools, load}]
}
]
}.

6、执行rebar3.compile

  • 在proto文件夹下添加测试test.proto文件
message person {required string name = 1;required int32 id = 2;optional string email = 3;
}
  • 执行rebar3 compile,在include下得到生成的test_pb.hrl,src下得到生成的test_pb.erl

7、在test.app中使用#person{}记录

  • 修改test的rebar.config、test.app.src
rebar.config
{erl_opts, [debug_info]}.
{deps, [lager, protobuff]}. %% 添加protobuff{shell, [% {config, "config/sys.config"},{apps, [test]}
]}.test.app.src
{application, test,[{description, "An OTP application"},{vsn, "0.1.0"},{registered, []},{mod, {test_app, []}},{applications,[kernel,stdlib,lager, protobuff  %% 添加protobuff]},{env,[]},{modules, []},{licenses, ["Apache-2.0"]},{links, []}]}.
  • 修改test_app.erl
%%%-------------------------------------------------------------------
%% @doc test public API
%% @end
%%%--------------------------------------------------------------------module(test_app).-behaviour(application).-include_lib("protobuff/include/test_pb.hrl").  %% 包含test_pb.hrl-export([start/2, stop/1]).start(_StartType, _StartArgs) ->lager:log(info, self(), "test lager"),Person = #person{name = "test", id = 1, email = "mahuateng@qq.com"},  %% 创建Personlager:log(info, self(), "person id ~p name ~p email ~p", [Person#person.id, Person#person.name, Person#person.email]), %% 打印test_sup:start_link().stop(_State) ->ok.%% internal functions
  • 执行rebar3 shell
"C:\Program Files\erl10.4\bin\escript.exe" E:\test\rebar3 shell
===> Analyzing applications...
===> Compiling gpb
===> Compiling rebar3_gpb_plugin
===> Verifying dependencies...
===> App goldrush is a checkout dependency and cannot be locked.
===> App lager is a checkout dependency and cannot be locked.
===> Analyzing applications...
===> Compiling goldrush
===> Compiling lager
===> Analyzing applications...
===> Compiling protobuff
===> Compiling test
Eshell V10.4  (abort with ^G)
1> ===> Booted syntax_tools
1> ===> Booted compiler
1> ===> Booted goldrush
1> ===> Booted lager
1> ===> Booted test
1> 23:32:36.455 [info] test lager
1> 23:32:36.456 [info] person id 1 name "test" email "mahuateng@qq.com"
1>

可以看到输出两条日志,一条“test lager”, 一条“person id 1 name “test” email “mahuateng@qq.com””

三、其他

搭建到这,已经可以成功的使用proto了,在proto文件下可以随意的添加自己需要的.proto文件。
本文对proto的使用比较简单,后面会逐渐搭建项目中如何使用proto。

【erlang】【rebar依赖】添加protobuff(gpb)依赖相关推荐

  1. erlang rebar 配置mysql_Erlang Rebar 使用指南之四:依赖管理

    Erlang Rebar 使用指南之四:依赖管理 全文目录: 本章链接: 1 rebar依赖定义 Rebar取得和构建符合OTP/Rebar规范的项目.如果项目包含子项目,Rebar会自动递归地构建它 ...

  2. [erlang] [rebar依赖] app使用lager依赖

    [erlang] [rebar3依赖] lager依赖 一.rebar3添加依赖 这里介绍一下rebar3依赖的声明和使用,其他更多的依赖项内容可以看官方文档rebar3依赖相关文档连接 1.声明依赖 ...

  3. maven添加oracle jdbc依赖

    maven添加oracle jdbc依赖 由于Oracle授权问题,Maven不提供Oracle JDBC driver,为了在Maven项目中应用Oracle JDBC driver,必须手动添加到 ...

  4. maven 如何给web项目添加jar包依赖

    maven 如何给web项目添加jar包依赖 CreateTime--2018年4月19日19:06:21 Author:Marydon 开发工具:eclipse 1.打开pom.xml文件--> ...

  5. quartz定时器依赖_JAVA使用quartz添加定时任务,并依赖注入对象操作

    最近在写定时任务,以前没接触过.查了些相关资料说使用quartz定时框架. 需要配置文件:config-quartz.xml 相关配置如下(红色部分是之后添加的,在后面步骤会说明): xsi:sche ...

  6. android将项目添加到github,将github库作为依赖添加到Android-Studio项目中

    将github库作为依赖添加到Android-Studio项目中 我试图从https://github.com/chrisbanes/ActionBar-PullToRefresh/wiki/Quic ...

  7. spring boot 本地maven手动添加pom.xml依赖

    spring boot 本地maven手动添加pom.xml依赖 按照如下pom.xml配置,本地jar包可以正常使用,适用于maven仓库中没有的的jar包下载下来,手动添加依赖. <!-- ...

  8. Android Framewrok 添加系统默认依赖库

    目录 前言 1.定制库的创建 2.修改编译工具代码并解决报错. 3.其他模块引用库内变量进行测试 前言 在android framework开发中,OEM 一般会封装一些定制库文件,几乎在系统中所有定 ...

  9. 【记录ROS学习(五)2022/08/27】Win版ROS/Noetic 如何添加必要的依赖(rosdep)

    [记录ROS学习(五)2022/08/27]Win版ROS/Noetic 如何添加必要的依赖(rosdep) 近期为了使得更多的设备可以连入ROS,开始转向Windows平台的ROS,遇到一些问题 无 ...

最新文章

  1. win10子系统ubuntu root用户
  2. 三星s8和android auto,手机资讯导报:穿上马甲也认得三星GalaxyS8与LGG6再曝光
  3. mysql安装前的系统准备工作(转)
  4. mysql db link_oracle11G数据库db_link连接mysql配置(Windows下无需安装Gateway组件)
  5. python打砖块游戏算法设计分析_python小游戏--打砖块的实现与讲解(python自学总结系列)...
  6. 卸载vuecli3_112、vue-cli3安装遇到的问题,卸载不掉旧版本,导致更新不了
  7. enumerate取下标
  8. Android NDK开发之 与NEON相关的库
  9. Java对比两个json 的数据结构和内容是否一样
  10. 哲学家就餐问题与python解决方案
  11. python演示,用经验分布逼近总体精确分布
  12. 最新XNA开发游戏“Particle Wars”--粒子之战!
  13. 西安交大计算机学院 栾佳锡,史椸-西安交通大学-自动化科学与工程学院
  14. 华为服务器更换主板后怎么进系统,服务器换主板之后
  15. PHP中in_array 效率及其优化
  16. dx12 龙书第九章学习笔记 -- 纹理贴图
  17. Axure rp简单介绍及下载安装详细步骤
  18. Pratice Of Concurrency(一: BlockingQueue )
  19. rename命令和批量重命名
  20. 毕业分享 stm32独居老人看护与跌倒检测系统

热门文章

  1. 阿里P7程序员吐槽工作太累,找到60万的工作就离职,网友:高薪必高辛呀
  2. 晨起管家----蓝牙传图
  3. 老码识途之对象函数调用
  4. 信用卡中的“猫腻”用卡人需要注意了!
  5. VUE iView之栅格布局响应式布局
  6. 2048c语言的思路,C语言版2048小游戏创作思路及代码
  7. 3D建模和3D渲染技术专题一: 热身篇,光线追踪(path Tracing),环境光阴影(ambient occlusion),焦距效果(effect focus)介绍
  8. 钱诚:9.24黄金原油暴涨暴跌全面解套操作建议
  9. iconv 判断字符编码_iconv 字符集转换报错
  10. [SQL Server] sp_who, sp_who2和sp_who3