我是Erlang的新手,刚刚学习了Erlang的一些教程。来自TDD的背景我认为我应该遵循erlang中的一些TDD原则。我已将我的代码组织如下
root
|- tests
| |- name_builder_tests.erl
|- src
| |- name_builder.erl
我在root
目录中启动了eralg shell。但我无法从那里编译我的erl
文件,所以每次我对其中一个文件进行更改时我都必须切换到tests
或src
目录,我需要编译它们。
在编译模块或从特定模块执行函数时,有什么方法可以告诉shell在所有子目录中查找模块?我想问的是,如果我的shell位于root
目录,我可以成功执行以下
c(name_builder).
c(name_builder_tests).
答案 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 2:如果您正在处理计划比此更复杂的应用,我建议您查看rebar