2

我是 Erlang 的新手,刚刚浏览了一些关于 Erlang 的教程。来自 TDD 背景,我认为我应该遵循 Erlang 中的一些 TDD 原则。我组织了我的代码如下

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

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

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

c(name_builder).
c(name_builder_tests).
4

3 回答 3

3

让我们像这样组织代码。

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

比运行'./rebar compile eunit'。您可以在此处找到钢筋脚本和文档https://github.com/basho/rebar/wiki

于 2013-01-14T12:14:02.417 回答
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/然后通过运行将 ebin 目录添加到 sys 路径的命令来启动 shell

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

PS 2:如果您正在开发比这更复杂的应用程序,我建议您检查rebar

于 2013-01-14T14:57:37.947 回答
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,阿林

于 2013-01-13T20:43:18.653 回答