如何让erlang在当前目录的子目录中查找模块?

时间:2013-01-13 20:27:58

标签: erlang

我是Erlang的新手,刚刚学习了Erlang的一些教程。来自TDD的背景我认为我应该遵循erlang中的一些TDD原则。我已将我的代码组织如下

root
|- tests
|   |- name_builder_tests.erl
|- src
|   |- name_builder.erl

我在root目录中启动了eralg shell。但我无法从那里编译我的erl文件,所以每次我对其中一个文件进行更改时我都必须切换到testssrc目录,我需要编译它们。

在编译模块或从特定模块执行函数时,有什么方法可以告诉shell在所有子目录中查找模块?我想问的是,如果我的shell位于root目录,我可以成功执行以下

c(name_builder).
c(name_builder_tests).

3 个答案:

答案 0 :(得分:2)

让我们组织这样的代码。

root
|- test
|   |- name_builder_tests.erl
|- src
|   |- name_builder.erl
|- rebar
|- rebar.config

比运行'./rebar compile eunit'。 您可以在https://github.com/basho/rebar/wiki

找到Rebar脚本和文档

答案 1 :(得分:1)

进行单元测试时的一种方法是将测试放在与生产代码相同的模块中:

-module(my_code).
-export([run/0]).

run() -> ok.

-ifdef(TEST).
-include_lib("eunit/include/eunit.hrl").

run_test() ->
    ?assertEqual(ok, run()).

-endif.

这样你就可以接近你的测试了。 关于代码的可用性,您应该使用“-pa”参数运行erlang shell并指定代码的位置:

erl -pa src/

那是因为你默认编译会将光束文件放到与源相同的文件夹中。 但我建议使用像钢筋这样的东西,因为它会让你的生活更轻松。

HTH, 阿林

答案 2 :(得分:1)

您也可以使用Emakefile来告诉编译器在哪里查找源文件。

在根目录中创建一个名为Emakefile的文件,其中包含以下内容

{'src/*', [debug_info,
   {i, "src"},
   {i, "include"},     
   {outdir, "ebin"}]}.
{'test/*', [debug_info,
    {i, "src"},
    {i, "include"},
    {i, "test"},        
    {outdir, "ebin"}]}.

现在使用erl -make编译所有模块,这将把所有.beam文件放在ebin/目录中。

然后通过运行命令erl -pa ebin/来启动shell,这将把ebin目录添加到sys路径

PS 1:我也是一个erlang新手,我从Learn You Some Erlang学到了这种方法,更确切地说是从this lesson

PS 2:如果您正在处理计划比此更复杂的应用,我建议您查看rebar