为什么EUnit将.beam文件编译成.eunit/ebin?

ska*_*tek 2 erlang erlang-otp erlang-ports eunit

免责声明:这个问题的作者主要具有 Erlang/OTP 的理论知识。

我有一个小型 OTP 应用程序,它myapp/ebin通过open_port(). 当我运行应用程序本身时,一切顺利,可执行文件的端口已成功打开。

但是,当我尝试为应用程序运行单元测试时,依赖于失败的单元测试open_port(),因为当启动EUnit应用程序时尝试在myapp/.eunit/ebin.

如何在不更改应用程序本身的代码的情况下更改该行为?如何使用与运行应用程序本身相同的当前目录来运行 EUnit 测试?(我的意思是,为了能够运行 EUnit 而更改提供可执行文件路径的代码并不是一个好主意)。

编辑:我遵循了 Erlang邮件列表中的建议,但code:priv_dir(myapp_name)返回了{error, bad_name}

编辑:我可以看到.eunit/包含modulename.beam文件并且ebin/包含modulename.beam文件和modulename_tests.beam文件。现在我完全迷失了。当我运行时make testrebar运行eunit命令,该命令调用目录modulename_tests.beam中的每个文件,该文件调用目录中的ebin/相应文件(清楚地显示文件是在测试期间执行的)。为什么会这样呢?为什么我们需要从目录运行文件而不是?modulename.beam.eunit/filename:absname("")modulename.beam.eunit/modulename.beam.eunit/ebin/

myapp/ebin为什么我们实际上需要在和中拥有完全相同的 .beam 文件myapp/.eunit/ebin

PS我看了官方文档,没有找到解决办法。

Ric*_*rdC 5

EUnit 本身不会执行此操作 - .eunit 目录是 Rebar 使用的约定。