最近需要用到protobuf,所以使用了gpb,由于项目是用rebar3构建的,正好rebar3有插件生成gpb,所以引入了rebar3_gpb_plugin, 按照文档配置参数,但是在生成的时候,导出路径出现了问题。

问题描述

在rebar3 release项目中使用rebar3_gpb_plugin插件的时候,指定的相对路径是基于项目默认profile,所以最终生成的文件也是基于_build/default/lib/app_floder下的,导致不在开发文件夹内,无法被识别与编译

解决方案

在app目录下的config里单独配置gpb相关参数即可

踩坑过程

各种测试项目对比

类型项目名称结果
rebar3 releasetest_gpb_release出现问题
rebar3 apptest_gpb_app未出现问题

rebar配置文件

{erl_opts, [
    debug_info,
    {i, "./_build/default/plugins/gpb/include/"}
]}.

{plugins, [
    {rebar3_gpb_plugin, "2.10.0"}
]}.

{gpb_opts, [
    {i, "proto"},
    {o_erl, "src"},
    {o_hrl, "include"},
    {module_name_suffix, "_pb"},
    {strings_as_binaries, true},
    {recursive, true},
    type_specs
]}.

{provider_hooks, [
    {pre, [{compile, {protobuf, compile}}]}
]}.

执行编译命令之后apps/test_gpb_release下并未出现生成的协议文件,_build/default/lib/test_gpb_release下出现了生成的协议文件!
_build/default/lib/test_gpb_release/ebin下也没有编译过的文件,所以协议根本没有被编译
然后测试app项目,输出路径正确。

解决过程

百度/google,没有相关信息
咨询前辈,没有得到太多有效信息
查询rebar3文档,配置完全正确
查rebar3_gpb_plugins字数文件,配置正确,没有有效信息
只好给作者提issues, 正在提的过程中,弹出一个相似的issues,发现已经有人遇到过这个问题了Issues地址
原来作者已经解决了这个问题,但只是一个小的修复,并没有写到文档里面。
然后根据指示修复。


ok.