【问题标题】:erlang - rest api example and problem with compilationerlang - rest api 示例和编译问题
【发布时间】:2021-12-11 04:00:10
【问题描述】:

我正在尝试将此项目用于教育目的: https://github.com/dronowar/erlang_rest_api

但是代码编译和本地运行存在问题:

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

【问题讨论】:

    标签: api rest erlang


    【解决方案1】:

    老实说,这可能是很多事情。该项目已有 3-4 年的历史,所有的部门都已取消固定,即将获取最新版本。

    可能值得将它们归结为与该项目同时代的东西。

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

    我尝试使用 Erlang 20 运行 make,但由于缺少 C++ 编译器(我在 Windows 上)而失败,但它在构建/编译过程中肯定会走得更远。所以也许降级 Erlang 来试试。

    【讨论】:

      【解决方案2】:

      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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-10-10
        • 2012-05-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多