erlang - rest API示例和编译问题

bxjv4tth  于 2022-12-08  发布在  Erlang
关注(0)|答案(2)|浏览(168)

I am trying to use this project for educational purposes: https://github.com/dronowar/erlang_rest_api
But problem with code compilation and make 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
yc0p9oo0

yc0p9oo01#

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

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

(Note第二行以制表符开头,* 而不是 * 一连串空格。)
有了这个更改,节点为我启动,并抱怨无法连接到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

twh00eeo

twh00eeo2#

老实说,这可能是很多事情。该项目是3-4岁,所有的deps是unpinned iidoee.将获取最新的版本。
也许值得把它们追溯到与这个项目同时代的东西上。
在Erlang 24中,rebar 3抱怨erlang:get_stacktrace()被删除,这意味着deps没有被编译。
我试着用Erlang 20运行make,结果失败了,因为缺少C++编译器(我用的是Windows),但它确实在构建/编译过程中走得更远了。

相关问题