【问题标题】:How to make erlang look for module within sub-directories of current directory?如何让erlang在当前目录的子目录中查找模块?
【发布时间】:2012-12-27 18:50:13
【问题描述】:

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

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

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

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

c(name_builder).
c(name_builder_tests).

【问题讨论】:

    标签: erlang


    【解决方案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 目录添加到系统路径

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

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

    【讨论】:

    • 继续使用钢筋,但我喜欢 Emakefile 方法
    【解决方案2】:

    让我们像这样组织代码。

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

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

    【讨论】:

    • 经过大量关于将测试代码与生产代码分离的麻烦之后,我放弃了。与钢筋一起去。它非常优雅。
    【解决方案3】:

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

    -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, 阿林

    【讨论】:

    • 我读过“将代码和测试放在一个模块中”的方法,但老实说,我不喜欢这种方法。我猜将测试与生产代码混合是一个坏主意。顺便问一下什么是钢筋?
    • 使用 rebar 的建议基本上只是提供使用standard OTP structure 构建应用程序的建议的一种方式。 Rebar 只是一个可以提供帮助的工具。
    • 我怀疑您会发现将测试与生产代码混合使用函数式编程语言更明智/更安全。您不必担心全局变量或私有对象方法。
    • @macintux 在阅读了一些关于编译包含/排除测试的代码的能力后,我明白你的观点,在 Erlang 世界中,将测试和生产代码放在同一个文件中是可以接受的。但对于我的 OO 头脑来说,它仍然感觉有点不干净。
    猜你喜欢
    • 2011-06-09
    • 1970-01-01
    • 1970-01-01
    • 2017-01-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-27
    • 1970-01-01
    相关资源
    最近更新 更多