初学者安装模块最简单的方法是什么?

时间:2015-12-15 00:19:23

标签: erlang

我查了rebar,但这看起来太复杂了。也许有人可以在以下钢筋应用程序中发布一些说%Post your code here的内容:

%%%-------------------------------------------------------------------
%% @doc myapp public API
%% @end
%%%-------------------------------------------------------------------

-module('myapp_app').

-behaviour(application).

%% Application callbacks
-export([start/2
        ,stop/1]).

%%====================================================================
%% API
%%====================================================================

start(_StartType, _StartArgs) ->
    'myapp_sup':start_link().

%%--------------------------------------------------------------------
stop(_State) ->
    ok.

初学者是否有更容易的选择?

6 个答案:

答案 0 :(得分:4)

如果要创建任何非平凡的东西,你就无法逃避学习语言的构建系统。如果你熟悉GNU Make,你可以使用erlang.mk而不是Rebar,但我相信Rebar3是最适合初学者的。

要解决在REPL中运行某人库代码的具体问题,请使用rebar3尝试以下内容:

  

rebar3新应用

忽略它现在创建的源文件。修改rebar.configadd dependencies。然后,启动一个加载了这些依赖项的REPL(以及您在src/目录中创建的任何源文件):

  

rebar3 shell

答案 1 :(得分:2)

我认为没有更简单的方法。学习钢筋看起来像是合乎逻辑的一步。我还认为,螺纹钢需要付出很多努力,而{2}对母羊Erlang更有吸引力。

答案 2 :(得分:1)

我去年开始学习erlang,我发现对熟悉erlang非常有帮助的是在你选择的简单记事本中编写代码,并将其保存为myapp_app.erl。然后我打开erlang控制台,使用编译命令c来编译我的模块,然后让我调用我的函数。

> c(myapp_app).
> myapp_app:start(a,b).

答案 3 :(得分:0)

Erlang将在代码路径中查找模块。

您可以通过调用code:get_path()

来查看代码路径
4> code:get_path().
[".","/usr/lib/erlang/lib/kernel-3.0.3/ebin",
 "/usr/lib/erlang/lib/stdlib-2.2/ebin",
 "/usr/lib/erlang/lib/xmerl-1.3.7/ebin",
 ...
 ...

如您所见,包含当前目录,其他所有内容都可能位于某个默认系统安装位置。对我来说,这意味着一切都将在' / usr / lib / erlang / lib'因为库路径与Debian Linux的关系,以及其他路径' APP-VERSION / ebin'从库路径扩展(见下文)......

可以通过调用code:lib_dir()

来查看库路径
5> code:lib_dir().
"/usr/lib/erlang/lib"
6> 

通过查找看起来像应用程序的所有内容来扩展库路径,即每个' APP-VERSION / ebin'它下面存在,它被添加到代码路径中。那是如何生成代码路径的。当然还添加了当前目录。

code module(值得一读)有各种更改代码路径的功能,还有一些环境变量,例如 ERL_LIBS ,可以添加更多路径,而 -pa 参数也允许您添加代码路径。

注意 ERL_LIBS添加了一个lib,将搜索APP-VERSION / ebin的出现次数,其中-pa完全按照原样添加代码路径。

所以,一旦你知道了这一切,安装模块的最简单方法是......

  • 将编译后的光束文件复制到当前目录。

OK!这是最简单的,但稍微更先进的解决方案可能是合适的......

  • 库路径下创建一些目录(让我们说' my_app-1.0 / ebin',这样就是' / usr / lib /我的系统上的erlang / lib / my_app-1.0 / ebin'并将你的光束文件复制到那个。

完成后,启动Erlang,它应该添加' my_app-1.0 / ebin'到代码路径和应该找到的任何梁文件。它们已安装。

注意' my_app-1.0'可以是任何东西。它的惯例只是说这应该是带有短划线和版本的应用程序的名称。虽然是一个有用的约定。

这只是安装一个模块,这是你的问题,但为了完整起见,值得一提的是,安装应用程序可以通过将 .app 文件复制到代码路径位置来完成同样。就这么简单。

对于初学者来说,当前目录中没有模块源(并在那里编译它们)确定并不太难?然后,将文件复制到系统位置只需要一小步。通常,您下载和编译的第三方应用程序将生成一个带有应用程序文件和所有光束文件的ebin目录,因此这只是将ebin应用到my_app-version / ebin的问题......

答案 4 :(得分:0)

如果你想用一些玩具应用程序来试验erlang,为了掌握语言,进程创建,通信甚至简单的监督树,你真的不需要一个应用程序,一个简单的标准otp目录结构就足够了启动功能。

另一方面,如果您打算构建一个具有依赖关系的应用程序,如果您想创建一个库,一个版本,管理单一测试和功能测试......那么rebar(和rebar3)将使您的生活更加简单

您将在learn you some erlang: Building application with OTP及以下章节中找到基本知识,了解如何定义应用程序或版本。

答案 5 :(得分:0)

这是我最终做的事情:

Install rebar3

$ git clone https://github.com/rebar/rebar3.git
$ cd rebar3
.../rebar3$ ./bootstrap
     

现在你有了脚本rebar3并且可以将它复制到某个地方   您的$ PATH,如上一节所述。

或者,您可以下载.zip file,解压缩,然后切换到rebar3目录并发出./bootstrap命令。

rebar3目录中创建可执行文件/rebar3。我将rebar3可执行文件移动到/usr/local/bin,这是我的PATH环境变量中列出的目录(讨论了各种可能的PATH位置here):

.../rebar3$ sudo mv rebar3 /usr/local/bin

这允许我在任何提示符下使用rebar3命令。作为an alternative,在您创建应用程序后(请参阅下一步),您可以将rebar3复制到应用程序的目录中,并从该目录发出如下的钢筋命令:

$ ./rebar3 .....

然后我created a new app

~/erlang_programs$ rebar3 new app myapp

(替换您的应用名称代替:myapp)

然后:

~/erlang_programs$ cd myapp
~/erlang_programs/myapp$ 

为了使用jsx,第三方JSON库,我将jsx添加为dependency

  

依赖关系列在deps键下的rebar.config文件中:

{erl_opts, [debug_info]}.
{deps, [
  {jsx, "2.8.0"}
]}.

rebar.config就在这里:

~/erlang_programs/myapp$ ls
LICENSE     _build      rebar.lock
README.md   rebar.config    src

然后我将我的erlang程序添加到myapp/src目录:

程序my_app / SRC / my.erl:

-module(my).
-export([test/0]).

test() ->
    jsx:decode(<<"{\"data\": [1, 2, 3]}">>).

最后:

~/erlang_programs/myapp$ rebar3 shell

===> Verifying dependencies...
===> Fetching jsx ({pkg,<<"jsx">>,<<"2.8.0">>})
===> Version cached at /Users/7stud/.cache/rebar3/hex/default/packages/jsx-2.8.0.tar is up to date, reusing it
===> Compiling jsx
===> Compiling myapp

Erlang/OTP 17 [erts-6.4] [source] [64-bit] [smp:4:4] [async-threads:0] [hipe] [kernel-poll:false]

Eshell V6.4  (abort with ^G)
1> my:test().
[{<<"data">>,[1,2,3]}]

如果您对.erl文件进行了更改,在我的情况下是文件my.erl,您不需要退出shell - 只需像往常一样进行编译,例如: c(my)