Erlang - rest API示例和编译问题



我想把这个项目用于教育目的:https://github.com/dronowar/erlang_rest_api

但是代码编译有问题,并且使run-local:

erl -config config/sys -pa ./ebin -pa ./deps/*/ebin -sname erl@localhost -s erl -s sync
Erlang/OTP 24 [erts-12.1.2] [source] [64-bit] [smp:8:8] [ds:8:8:10] [async-threads:1] [jit] [dtrace]
{"init terminating in do_boot",{undef,[{erl,start,[],[]},{init,start_em,1,[]},{init,do_boot,3,[]}]}}
init terminating in do_boot ({undef,[{erl,start,[],[]},{init,start_em,1,[]},{init,do_boot,3,[]}]})
Crash dump is being written to: erl_crash.dump...done
make: *** [run-local] Error 1

似乎Makefile与现代Rebar3版本不同步。我将run-local目标改为:

run-local:
erl -config config/sys -pa _build/default/lib/*/ebin -sname $(APPNAME)@localhost -s $(APPNAME) -s sync

(注意第二行以制表符开始,不是一串空格)

通过这个更改,节点为我启动,并抱怨无法连接到Postgres。


你怎么知道的?你得到的误差是{undef,[{erl,start,[],[]}。这意味着它试图以零参数调用模块erl中的函数start(参数列表为空,[]),但是没有这样的函数,要么是因为模块没有这样的函数,要么是因为整个模块无法加载。

所以我搜索编译模块,erl.beam:

$ find . -name erl.beam
./_build/default/lib/erl/ebin/erl.beam

现在Rebar3喜欢把编译后的文件放在_build子目录中,但是当编写erlang_rest_api时,它显然只使用了ebin子目录。erl的-pa参数指示模块搜索路径,因此我们只需在那里添加正确的目录,并删除现在未使用的-pa ./ebin -pa ./deps/*/ebin

老实说,这可能是很多事情。这个项目已经有3-4年的历史了,所有的深度都是不固定的,也就是说,将获取最新的版本。

也许值得把它们固定在与项目同时代的东西上。

在Erlang 24中,rebar3抱怨由于erlang:get_stacktrace()被删除,这意味着深度没有被编译。

我尝试使用Erlang 20运行make,最终由于缺少c++编译器(我在Windows上)而失败,但它肯定在构建/编译过程中得到了进一步的发展。所以也许降级Erlang试试。

最新更新