Giter Site home page Giter Site logo

rebar3_gpb_plugin's Introduction

Rebar3 gpb plugin

A rebar3 plugin for automatically compiling .proto files using the gpb protobuf compiler

Build

$ rebar3 compile

Use

Add the plugin to your rebar config:

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

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

Configure gpb options (example below), full list can consulted on gpb's project page gpb_compile:file/2:

{gpb_opts, [
    {i, "path/to/proto_dir"} | {i, {deps, "relative/path/from/deps/to/proto_dir"}},
    {f, ["desired_proto_file1.proto"]},
    {module_name_suffix, "_pb"},
    %{o, "path/to/out_dir"},    %% both .erl and .hrl are generated here
    {o_erl, "path/to/out_src"},
    {o_hrl, "path/to/out_include"},
    {strings_as_binaries, true},
    type_specs]}.

The i, o_erl and o_hrl option values are relative to the app's location. Default values are:

  • {i, "proto"}
  • {o_erl, "src"}
  • {o_hrl, "include"}

Plugin specific options (can be used together the gpb ones):

{gpb_opts, [
    {recursive, boolean()},
    {ipath, "path/to/another/proto_dir"} | {ipath, {deps, "path/from/deps/dir/to/another/proto/dir"}}
]}.
  • {recursive, boolean()} - look recursively through the provided folders to look for .proto files (default is true)

  • {ipath, "path/to/another/proto_dir"} - paths that are to be added to gpb's include path but not searched for .proto files (useful for importing .proto files from other .proto).

  • {i, {deps, "relative/path/from/deps/to/proto_dir"}} - allows you to compile proto files that were declared and fetched as app dependencies, the rebar_raw_resource plugin is a good fit for this use case.

  • {ipath, {deps, "relative/path/from/deps/to/proto_dir"}} - allows you to specify proto include paths in the same fashion as the {i, {deps, _}} directive.

  • `{f, ["file1.proto", "file2.proto"]} - allows you to specify a subset of all proto files found. Add the gpb include path (environment tipically is default):

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

Add a hook to automatically generate modules for your protobuf files and clean them afterwards:

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

Usage with umbrella projects

When using the gpb plugin with umbrella projects (aka having a apps/<project> structure) the gpb_opts and provider_hooks should not be in the top level rebar.config! Doing so would lead to undesired behavior and problems like code files not being compiled.

The solution is to create apps/<project>/rebar.config and specify gpb_opts and provider_hooks in this instead of the top level config. An example config would look like this:

%% -*- erlang -*-

%%-------------------------------------------------------------------
%% GPB
%%-------------------------------------------------------------------

{gpb_opts, [
    {i, "proto"},
    {module_name_suffix, "_pb"},
    {o_erl, "src"},
    {o_hrl, "include"},
    {strings_as_binaries, true},
    type_specs]}.
{provider_hooks,
 [{pre, [
         {compile, {protobuf, compile}},
         {clean, {protobuf, clean}}
        ]}
 ]}.

More examples

Complete usage examples are located in doc/samples.

rebar3_gpb_plugin's People

Contributors

alexmihaj avatar benoitc avatar ddovod avatar dsrosario avatar fenollp avatar getong avatar goofansu avatar hnrkptrsn avatar licenser avatar lrascao avatar paulo-ferraz-oliveira avatar shionryuu avatar stwind avatar tomas-abrahamsson avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar

rebar3_gpb_plugin's Issues

New versiof gpb: 4.17.1

I've just pushed version 4.17.1 of gpb, but given the discussion in #139, how should we proceed? Will you just change the dependency to "~> 4" like @paulo-ferraz-oliveira suggested and no PR for 4.17.1 would be needed (if I understood right)? Or should I make some PR? (If so, what should it look like?)

Regeneration of file if already in place?

I just spent a while debugging an issue with Riak KV, where if the src/.erl file that's generated by the tool, is already there but the include/ file is not, the include file is not regenerated. I ran into this because the src file had not been excluded by the .gitignore and had been accidentally committed. This caused all subsequent compilations to fail because the src file was never removed, and therefore the include file was never regenerated.

Is this expected behavior?

It also seems like with rebar3, these files should never be placed in the actual include/src directories, but only placed in the build output, therefore reducing the probability of this issue.

Can you upgrade gpb deps to 4.14.0

My project use erlang + go grpc communication,
and nested proto files contain "import public xxx.proto" for go grpc support ,
but gpb support this feature from 4.14.0, or it will crash to generate erlang pb files

Compilation doesn't work without provider hooks

Steps to reproduce:

  1. git clone https://github.com/hexpm/hex_erl && cd hex_erl
  2. rebar3 protobuf clean - doesn't do anything
  3. rm -rf src/*pb* && rebar3 protobuf compile - doesn't generate files
  4. Add provider hooks
  5. rm -rf _build
  6. rebar3 compile - works
  7. rebar3 clean - works

we'd like to use the plugin without provider hooks because hex_erl is meant to be used as a dependency, proto files generated .erl files are vendored in, and there should be no dependency on gpb. More context here: hexpm/hex_core#20

how to generalize the proto files path for umbrella projects

I have a umbrella project which has multiple OTP applications. I tried to integrate proto files repository as below for one of the application and it works fine . Now if I try to add appl2 in main top application 1 it will not detect the proto files as the path _build/default/lib/appl3 is not discoverable. Is it possible to generalize the {i, "_build/default/lib/appl3/proto"}, value so that it can be detected when appl2 in integrated in another application.

rebar.config of appl2

{deps, [ {appl3, {git, "https://<githuburl>/a/appl3.git", {branch, "master"}}} ]}. {gpb_opts, [ {i, "_build/default/lib/appl3/proto"}, {o_erl, "src"}, {o_hrl, "src"}, {strings_as_binaries, true}, type_specs, maps ]}.

rebar.config of top appl1

{deps, [ {appl2, {git, "https://<githuburl>/a/appl2.git", {branch, "master"}}} {appl3, {git, "https://<githuburl>/a/appl3.git", {branch, "master"}}} ]}.

Issu with rebar3 and last version of gpb plugin

With version 2.20.2 I have problems using umbrella project and rebar.config as in example

rebar3_gpb_plugin/doc/samples/sample_release/

rebar 3.16.1 on Erlang/OTP 24 Erts 12.0.1 error:

===> Uncaught error in rebar_core. Run with DIAGNOSTIC=1 to see stacktrace or consult rebar3.crashdump
===> Uncaught error: undef

Output in rebar3.crashdump:

Error: undef
[{gpb_compile,list_io,
              ["/devel/apps/datamsgs/proto/cml.proto",
               [{i,"/devel/apps/datamsgs/proto"},
                {module_name_suffix,"_pb"},
                {o_erl,"/devel/_build/default/lib/datamsgs/src"},
                {o_hrl,"/devel/_build/default/lib/datamsgs/include"},
                {strings_as_binaries,true},
                type_specs,
                {i,"/devel/apps/datamsgs/proto"}]],
              []},
 {rebar3_gpb_compiler,get_target,2,
                      [{file,"/devel/_build/default/plugins/rebar3_gpb_plugin/src/rebar3_gpb_compiler.erl"},
                       {line,142}]},
 {rebar3_gpb_compiler,compile,4,
                      [{file,"/devel/_build/default/plugins/rebar3_gpb_plugin/src/rebar3_gpb_compiler.erl"},
                       {line,111}]},
 {lists,foreach,2,[{file,"lists.erl"},{line,1342}]},
 {rebar3_gpb_prv_compile,do,1,
                         [{file,"/devel/_build/default/plugins/rebar3_gpb_plugin/src/rebar3_gpb_prv_compile.erl"},
                          {line,47}]},
 {rebar_core,do,2,
             [{file,"/devel/rebar3/src/rebar_core.erl"},{line,155}]},
 {rebar_hooks,run_provider_hooks_,6,
              [{file,"/devel/rebar3/src/rebar_hooks.erl"},{line,70}]},
 {rebar_hooks,run_all_hooks,6,
              [{file,"/devel/rebar3/src/rebar_hooks.erl"},{line,18}]}]

using any (older) version 2.19.1, 2.20.0 and/or 2.20.1 solved the issue. I stayed with 2.20.1.

If you need any more info, let me know to investigate more. Thank you.

hooks prevent compilation

I've noticed some odd behaviour I'm not sure if that is a change in how rebar handles compilation now or when the plugin.

So here it what I figured out so far:

when compiling with the default settings and hooks the _pb.erl file gets put in _build/default/lib/<app>/src then when the "normal" compile happens rebar finds the src directory and doesn't copy the original files.

This can be worked around by changing the config to however that probably is not as it is supposed to work.

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

code generated fails on dialyzer

the code gpb generates causes dialyzer error:

apps/ddb_proxy/src/remote_pb.erl
  38: Type specification remote_pb:encode_msg(_) -> binary() is a supertype of the success typing: remote_pb:encode_msg(#'WriteRequest'{timeseries::[#'TimeSeries'{labels::[any()],samples::[any()]}]} | #'LabelPair'{name::'undefined' | binary() | maybe_improper_list(binary() | maybe_improper_list(any(),binary() | []) | byte(),binary() | []),value::'undefined' | binary() | maybe_improper_list(binary() | maybe_improper_list(any(),binary() | []) | byte(),binary() | [])} | #'Sample'{value::'-infinity' | 'infinity' | 'nan' | 'undefined' | number(),timestamp_ms::'undefined' | integer()} | #'TimeSeries'{labels::[#'LabelPair'{name::'undefined' | binary() | maybe_improper_list(any(),binary() | []),value::'undefined' | binary() | maybe_improper_list(any(),binary() | [])}],samples::[#'Sample'{value::'-infinity' | 'infinity' | 'nan' | 'undefined' | number(),timestamp_ms::'undefined' | integer()}]}) -> binary()
  42: Type specification remote_pb:encode_msg(_,[any()]) -> binary() is a supertype of the success typing: remote_pb:encode_msg(#'WriteRequest'{timeseries::[#'TimeSeries'{labels::[any()],samples::[any()]}]} | #'LabelPair'{name::'undefined' | binary() | maybe_improper_list(binary() | maybe_improper_list(any(),binary() | []) | byte(),binary() | []),value::'undefined' | binary() | maybe_improper_list(binary() | maybe_improper_list(any(),binary() | []) | byte(),binary() | [])} | #'Sample'{value::'-infinity' | 'infinity' | 'nan' | 'undefined' | number(),timestamp_ms::'undefined' | integer()} | #'TimeSeries'{labels::[#'LabelPair'{name::'undefined' | binary() | maybe_improper_list(any(),binary() | []),value::'undefined' | binary() | maybe_improper_list(any(),binary() | [])}],samples::[#'Sample'{value::'-infinity' | 'infinity' | 'nan' | 'undefined' | number(),timestamp_ms::'undefined' | integer()}]},[any()]) -> binary()

is it a bug?

rebar3_gpb_plugin version : 2.16.0
gpb version : 4.14.0

rebar3_gpb_compile:filter_included_proto/3 line 165
gpb_parse:fetch_imports/1 is removed, It will crash when I compile
change to 'gpb_parse_old:fetch_imports/1' is OK.

and I have two .proto files : all.proto and stall.proto
I set rebar.config the {gpb_opts, [ {f, ["all.proto"]} }
It generates stall.erl and stall.hrl instead of all.erl and all.hrl

I see the code in rebar3_gpb_compile:is_wanted_proto/2
string:find(ProtoPath, WantedProto, trailing)
Is this what you want?
how can I generate all.erl and all.hrl ??

Can't find include file "gpb.hrl"

FYI, rebar.config:

%% -*- mode: erlang; -*-

{erl_opts, [debug_info]}.
{deps, [{ranch, "1.2.1"}]}.
{plugins, [rebar3_gpb_plugin]}.
{provider_hooks, [
                  {pre, [{compile, {protobuf, compile}}]}
                 ]
}.
{gpb_opts, [
            {i, "./proto"},
            {o_erl, "./src"},
            {o_hrl, "./include"},
            {module_name_suffix, "_pb"},
            {strings_as_binaries, true},
            type_specs
           ]
}.

Folder `include` required even if unused

I'm using the plugin with a maps-based approach (option maps), so no o_hrl is required.
I don't have an include folder (which the plugin "feels" it needs), so the plugin doesn't allow me to move forward (because of https://github.com/lrascao/rebar3_gpb_plugin/blob/develop/src/rebar3_gpb_compiler.erl#L36).
My alternatives, at the moment, are:

  • create an empty include folder (with an empty file I have to push to remote), or
  • use o_hrl = src so the check doesn't fail.

Since that check seems useless we could probably do without it.
I'm not sure maps is the only option that affects this.
I'm willing to implement whatever we agree upon so this isn't an impediment to others.

Protocol definitions residing in sub-directories fail to compile

E.g. when using recursive search (which is what happens by default), if protocol directory is "proto", and there's a protocol definition residing in subdirectory "foo" - "proto/foo/bar.proto" - code generation will fail with cryptic message 'Could not find import file "bar.proto"'

This can be worked around by explicitly setting "proto/foo" as an include path ('ipath' option.)

Issue with latest rebar3

I am observing below issue with latest rebar3 version 3.14.4. any idea how to solve this problem?

===> 	{post_hooks, [{compile,
                                  "escript build/prepend_edoc_autogenerated src/gpb_scan_old.erl        src/gpb_scan_old.xrl"},
                              {compile,"escript build/compile_descriptor"}]}.
Compiling descriptor.proto...
escript: exception error: undefined function gpb_compile:file/2
===> Hook for compile failed!

Failure to compile protos with package

I am having a problem compiling my project with rebar3 using the gpb plugin. It is erroring out on the package service; line in the .proto. All the protos compile with protoc without issue.

See the attached log for the output.
output.log

My project is set up as an umbrella project and the rebar.config for gpb is in the app directory where the protos are to be compiled.

I am attaching several screenshots of my project including one of the source for the proto in question.

intellij-4

intellij-3

Weirdly enough, at one point I was getting an error message like one of your closed issues that it could not find the file. That is no longer happening. Finally, I took your sample_app and modified it so that it had protos in different sub-directories and specified packages and it worked, so not sure what it is about my project that is causing this issue and why it manifests like this.

Thanks in advance!

UPDATE
I simplified the number of protos and tried to just remove the package from the proto, but unfortunately they still need to reference other packages. I got this output

output-1.log

issue with latest rebar3

I got this issue while trying to compile using latest rebar3, any idea what's the issue?

[barrel_pb] DEBUG=1 rebar3 compile                                                                                                       17:06:49
===> Load global config file /Users/benoitc/.config/rebar3/rebar.config
===> Uncaught error in rebar_core. Run with DEBUG=1 to see stacktrace
===> Uncaught error: function_clause
===> Stack trace to the error location: [{rebar3,test_defined,
                                                 [{i,
                                                   "./_build/default/plugins/gpb/include"}],
                                                 [{file,
                                                   "/home/tristan/Devel/rebar3/_build/default/lib/rebar/src/rebar3.erl"},
                                                  {line,358}]},
                                                {rebar3,
                                                 safe_define_test_macro,1,
                                                 [{file,
                                                   "/home/tristan/Devel/rebar3/_build/default/lib/rebar/src/rebar3.erl"},
                                                  {line,353}]},
                                                {rebar3,test_state,1,
                                                 [{file,
                                                   "/home/tristan/Devel/rebar3/_build/default/lib/rebar/src/rebar3.erl"},
                                                  {line,347}]},
                                                {rebar3,run_aux,2,
                                                 [{file,
                                                   "/home/tristan/Devel/rebar3/_build/default/lib/rebar/src/rebar3.erl"},
                                                  {line,119}]},
                                                {rebar3,main,1,
                                                 [{file,
                                                   "/home/tristan/Devel/rebar3/_build/default/lib/rebar/src/rebar3.erl"},
                                                  {line,56}]},
                                                {init,start_it,1,[]},
                                                {init,start_em,1,[]}]

The configuration is the following:

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



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

{provider_hooks, [
                  {pre, [
                         {compile, {protobuf, compile}},
                         {clean, {protobuf, clean}}
                        ]}
                 ]}.
{gpb_opts, [
            {msg_name_prefix, "myproj_"},
            {module_name_prefix, "myproj_"},
            {module_name_suffix, "_pb"},
            {msg_name_to_lower, true},
            {strings_as_binaries, true},
            type_specs,
            strings_as_binaries
           ]}.

umbrella not supported

this code will raise error when app don't have gpb_opts
_build/default/plugins/rebar3_gpb_plugin/src/rebar3_gpb_compiler.erl:21

skip app if gpb_opts not exist?

Possible to parameterize version of gpb?

A curious question: Is it possible for the user of rebar3_gpb_plugin to parameterize the version of gpb? In the rebar.config or somewhere else if there's a more appropriate place?

I was thinking this could lead both to you not having to cut a new release every time I make a new version of gpb, and also that one particular use-case might be a little bit easier: for the user to see what actual version of gpb (or some other plugin-provided dependency) is used. It could be right in the rebar.config file (or wherever), whereas right now they might need to know that rebar3_gpb_plugin 1.10.4 maps to gpb 3.26.8.

Another use-case that might perhaps be a little more difficult would be for rebar3_gpb_plugin to have a sensible default. Maybe latest or perhaps master could do.

Maybe this is more of a question for rebar3 than for rebar3_gpb_plugin, although this particular plugin is of interest to me, of course :)

I should also say that for me, it is absolutely totally no problem at all to continue sending pull requests, I've automated it in a script, so it's no burden at all, I was just curious about possible alternatives.

compile proto error in LAN

I use this plugin ok when My server is connected the internet,
But my company has submit code to a local network perforce depot server,
after someone sync files from depot, they cann't compile proto, got the below errors:

./rebar3 compile
===> Plugin rebar3_gpb_plugin not available. It will not be used.
===> Plugin rebar3_gpb_plugin not available. It will not be used.
===> Verifying dependencies...
===> Compiling proto_app
===> Unable to run pre hooks for 'compile', command 'compile' in namespace 'protobuf' not found.
make: *** [all] Error 1

the gpb-plugin src files are in _build/default/plugins/rebar3_gpb_plugin/src
the gpb src files are in _build/default/plugins/gpb/src

what can I do to fix the problem ?

Upcoming functions in gpb could maybe be useful for rebar3_gpb_plugin

Hi, I was experimenting a bit with adding functions to gpb for calculating names of inputs dependencies and resulting outputs. It is currently on a branch in gpb, the makedep branch. I intend to merge it soon. This issue is mostly a heads-up, in case you think it could have use for it in rebar3_gpb_plugin, and if you should find something to add or modify for it to be of more value. Feel free to close this issue at any time.

Here's an annotated example to show how it works::

$ cat m/a2.proto 
syntax="proto2";
import "d/dir1/x.proto";
import "d/dir2/x.proto";
message MsgA { required uint32 f1 = 1; }

$ erl
1> gpb_compile:list_io("./m/a2.proto", [{i,"m"}, {o_erl,"src"}, {module_name_suffix, "_pb"}]).
[%% calculated outputs, options for output and renaming are considered:
 {erl_output,"src/a2_pb.erl"},
 {hrl_output,"./m/a2_pb.hrl"},
 %% Inputs, the first one is the main proto, any imports follow:
 {sources,["./m/a2.proto","m/d/dir1/x.proto",
           "m/d/dir2/x.proto"]},
 %% Any imported files that could not be located end up here:
 {missing,[]}]

(There are also some command line switches to access this functionality, inspired by the erlc and gcc -M family of options)

Uncaught error: {badmatch,error} with version 3.11.1

Running compile gives the following error:

===> Provider: {protobuf,compile}
===> Uncaught error in rebar_core. Run with DEBUG=1 to see stacktrace or consult rebar3.crashdump
===> Uncaught error: {badmatch,error}
===> Stack trace to the error location:
[{rebar3_gpb_compiler,compile,2,
                      [{file,"/home/frans/axolotl/_build/default/plugins/rebar3_gpb_plugin/src/rebar3_gpb_compiler.erl"},
                       {line,23}]},
 {lists,foreach,2,[{file,"lists.erl"},{line,1338}]},
 {rebar3_gpb_prv_compile,do,1,
                         [{file,"/home/frans/axolotl/_build/default/plugins/rebar3_gpb_plugin/src/rebar3_gpb_prv_compile.erl"},
                          {line,47}]},
 {rebar_core,do,2,[{file,"/opt/rebar3-3.11.1/src/rebar_core.erl"},{line,154}]},
 {rebar_hooks,run_provider_hooks_,6,
              [{file,"/opt/rebar3-3.11.1/src/rebar_hooks.erl"},{line,48}]},
 {rebar_hooks,run_all_hooks,6,
              [{file,"/opt/rebar3-3.11.1/src/rebar_hooks.erl"},{line,16}]},
 {rebar_prv_compile,compile,3,
                    [{file,"/opt/rebar3-3.11.1/src/rebar_prv_compile.erl"},
                     {line,161}]},
 {rebar_prv_compile,'-copy_and_build_project_apps/3-lc$^2/1-2-',3,
                    [{file,"/opt/rebar3-3.11.1/src/rebar_prv_compile.erl"},
                     {line,119}]}]

rebar3.conf has

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

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

I use the standard proto, include and src directories.
I would greatly appreciate some help in solving this one.

gpb_plugin uses function that was not exported: gpb_parse:fetch_imports

I am trying to use the gpb plugin with rebar3 to compile some protobufs in my erlang project.
I get the following error and the compilation files.
Turns, out the plugin actually uses a function that is not exported from gpb_parse..
specifically line: 165 in rebar3_gpb_compiler.erl calls gpb_parse:fetch_imports.

This function is no longer exported in the gpb project and is only present in gpb_parse_old.erl file.
I tried changing the line to use gpb_parse_old module and then the compilation works fine.
I wanted to check if there is a better way to solve this?
Please let me know.. I can then send out a pull request to fix this issue.

@tomas-abrahamsson @lrascao any thoughts?

Stacktrace:

===> Uncaught error in rebar_core. Run with DEBUG=1 to see stacktrace or consult rebar3.crashdump
===> Uncaught error: undef
===> Stack trace to the error location:
[{gpb_parse,fetch_imports,
            [[{proto_defs_version,1},
              {file,{"auth","auth.proto"}},
              .....
              .....
               [{field,version,1,2,string,optional,[]},
{erl_opts, [
                {field,expires_in_seconds,2,3,int64,optional,[]}]},
              {proto3_msgs,[]}]],
            []},
 {rebar3_gpb_compiler,filter_included_proto,3,
                      [{file,"_build/default/plugins/rebar3_gpb_plugin/src/rebar3_gpb_compiler.erl"},
                       {line,165}]},
 {lists,filtermap,2,[{file,"lists.erl"},{line,1317}]},
 {rebar3_gpb_compiler,compile,4,
                      [{file,"_build/default/plugins/rebar3_gpb_plugin/src/rebar3_gpb_compiler.erl"},
                       {line,128}]},
 {rebar3_gpb_compiler,compile,2,
                      [{file,"_build/default/plugins/rebar3_gpb_plugin/src/rebar3_gpb_compiler.erl"},
                       {line,68}]},
 {lists,foreach,2,[{file,"lists.erl"},{line,1338}]},
 {rebar3_gpb_prv_compile,do,1,
                         [{file,"_build/default/plugins/rebar3_gpb_plugin/src/rebar3_gpb_prv_compile.erl"},
                          {line,47}]},
 {rebar_core,do,2,
             [{file,"/tmp/cirrus-ci-build/src/rebar_core.erl"},{line,154}]}]
===> When submitting a bug report, please include the output of `rebar3 report "your command"`
make: *** [src] Error 1

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.