如何使erlang在当前目录的子目录中查找模块?
我是Erlang的新手,刚刚学习了一些Erlang教程。来自TDD的背景,我认为我应该在Erlang中遵循一些TDD原则。我的代码组织如下如何使erlang在当前目录的子目录中查找模块?,erlang,Erlang,我是Erlang的新手,刚刚学习了一些Erlang教程。来自TDD的背景,我认为我应该在Erlang中遵循一些TDD原则。我的代码组织如下 root |- tests | |- name_builder_tests.erl |- src | |- name_builder.erl 我在根目录下启动Erlang shell。但是我无法从那里编译我的erl文件,因此每次我更改其中一个文件并需要编译它们时,我必须切换到tests或src目录 在编译模块或执行特定模块中的函数时,我是否可以告诉
root
|- tests
| |- name_builder_tests.erl
|- src
| |- name_builder.erl
我在根目录下启动Erlang shell。但是我无法从那里编译我的erl
文件,因此每次我更改其中一个文件并需要编译它们时,我必须切换到tests
或src
目录
在编译模块或执行特定模块中的函数时,我是否可以告诉shell在所有子目录中查找模块?我想问的是,如果我的shell位于root
目录下,我能成功执行以下命令吗
c(name_builder).
c(name_builder_tests).
进行单元测试时的一种方法是将测试放在与生产代码相同的模块中:
-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/
这是因为在默认情况下,您正在编译的文件将与源文件放在同一文件夹中。
但我建议你使用像钢筋这样的东西,因为它会让你的生活更轻松
嗯,,
Alin让我们像这样组织代码
root
|- test
| |- name_builder_tests.erl
|- src
| |- name_builder.erl
|- rebar
|- rebar.config
然后运行“/rebar compile eunit”。
您可以在此处找到的钢筋脚本和文档您也可以使用来告诉编译器在哪里查找源文件
在根目录中创建一个名为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 dir添加到sys路径
PS 1:我也是一个几乎是erlang新手的人,我从,更准确地说是从
PS 2:如果你正在开发一款比这更复杂的应用程序,我建议你检查一下我读到的“将代码和测试放在一个模块中”的方法,但老实说,我不喜欢这种方法。我想将测试与生产代码混合是个坏主意。顺便问一下,什么是rebar?使用rebar的建议基本上只是一种使用。我想你会发现,使用函数式编程语言,将测试与生产代码混合使用更明智/更安全。您不必担心全局变量或私有对象方法。@macintux在阅读了包含/排除测试的代码后,我明白了您的观点,在Erlang world中,将测试和生产代码放在同一个文件中是可以接受的。但对于我的OO思想来说,它仍然感觉有点不干净。在经历了大量关于将测试代码与生产代码分离的麻烦之后,我放弃了。和钢筋一起去。它非常优雅。继续使用钢筋,但我喜欢Emakefile
appraoch