我想把这个项目用于教育目的: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试试。