在不同的文件夹中通过另一个访问一个 erlang 模块

Accessing one erlang module by another when in different folders

我有一个非常简单的疑问,但我似乎无法在任何地方找到合适的解决方案。 我有 2 个 erlang 模块,module1.erlmodule2.erl。根据我的项目提交指南的定义,这两个模块属于不同的部分,因此分别位于同一目录下的不同文件夹 part1 和 part2 中。结构如下所示:

src/
   part1/
       module1.erl
   part2/
       module2.erl

现在module2依赖于module1,调用module1的各种方法为module1:method()。当 module1.erlmodule2.erl 都在同一个文件夹中时,我能够实现全部功能,但现在它们在不同的文件夹中,我尝试 运行 module2.erl从 part2 文件夹,我不知道如何让 module2 编译和调用 module1 的方法。

由于正在使用模拟器,module1的路径不在code path中default 当我们直接在 module2 路径中使用默认选项启动模拟器时。这可以使用 ...

进行验证
1> code:get_path().
code:get_path().
[".","/usr/local/lib/erlang/lib/kernel-8.2/ebin",
 "/usr/local/lib/erlang/lib/stdlib-3.17/ebin",
 "/usr/local/lib/erlang/lib/xmerl-1.3.28/ebin",
 "/usr/local/lib/erlang/lib/wx-2.1.1/ebin",
 "/usr/local/lib/erlang/lib/tools-3.5.2/ebin",
 "/usr/local/lib/erlang/lib/tftp-1.0.3/ebin",
 "/usr/local/lib/erlang/lib/syntax_tools-2.6/ebin",
 "/usr/local/lib/erlang/lib/ssl-10.6/ebin",
 "/usr/local/lib/erlang/lib/ssh-4.13/ebin",
 "/usr/local/lib/erlang/lib/snmp-5.11/ebin",
 "/usr/local/lib/erlang/lib/sasl-4.1.1/ebin",
 "/usr/local/lib/erlang/lib/runtime_tools-1.17/ebin",
 "/usr/local/lib/erlang/lib/reltool-0.9/ebin",
 "/usr/local/lib/erlang/lib/public_key-1.11.3/ebin",
 "/usr/local/lib/erlang/lib/parsetools-2.3.2/ebin",
 "/usr/local/lib/erlang/lib/os_mon-2.7.1/ebin",
 "/usr/local/lib/erlang/lib/odbc-2.13.5/ebin",
 "/usr/local/lib/erlang/lib/observer-2.10.1/ebin",
 "/usr/local/lib/erlang/lib/mnesia-4.20.1/ebin",
 "/usr/local/lib/erlang/lib/megaco-4.2/ebin",
 "/usr/local/lib/erlang/lib/inets-7.5/ebin",
 "/usr/local/lib/erlang/lib/hipe-4.0.1/ebin",
 "/usr/local/lib/erlang/lib/ftp-1.1/ebin",
 "/usr/local/lib/erlang/lib/eunit-2.7/ebin",
 "/usr/local/lib/erlang/lib/et-1.6.5/ebin",
 "/usr/local/lib/erlang/lib/erts-12.2/ebin",
 "/usr/local/lib/erlang/lib/erl_interface-5.1/ebin",
 [...]|...]

这个列表里面有.,没有../part1,所以当我们编译的时候,在part2目录下,失败了...

2> c(module1).
c(module1).
{error,non_existing}

有几种方法可以解决这个问题,很少有简单的方法可以...

  1. c("../part1/module1.erl").。根据 c
  2. 的文档

...Module can be either a module name or a source file path, with or without .erl extension...

而这里,在上面的选项中,我们使用了module1.

源文件的相对路径
  1. 使用选项 -pa 调用 erl,在 erlang emulator.
  2. 的该会话的代码路径中添加 part1 的路径
part2$ erl -pa "../part1"
Erlang/OTP 25 [DEVELOPMENT] [erts-12.2] [source-c1ab4b5424] [64-bit] [smp:4:4] [ds:4:4:10] [async-threads:1] [jit:ns]

Eshell V12.2  (abort with ^G)
1> code:get_path().
["../part1",".","/usr/local/lib/erlang/lib/kernel-8.2/ebin",
 "/usr/local/lib/erlang/lib/stdlib-3.17/ebin",
 "/usr/local/lib/erlang/lib/xmerl-1.3.28/ebin",
 "/usr/local/lib/erlang/lib/wx-2.1.1/ebin",
 "/usr/local/lib/erlang/lib/tools-3.5.2/ebin",
 "/usr/local/lib/erlang/lib/tftp-1.0.3/ebin",
 "/usr/local/lib/erlang/lib/syntax_tools-2.6/ebin",
 "/usr/local/lib/erlang/lib/ssl-10.6/ebin",
 "/usr/local/lib/erlang/lib/ssh-4.13/ebin",
 "/usr/local/lib/erlang/lib/snmp-5.11/ebin",
 "/usr/local/lib/erlang/lib/sasl-4.1.1/ebin",
 "/usr/local/lib/erlang/lib/runtime_tools-1.17/ebin",
 "/usr/local/lib/erlang/lib/reltool-0.9/ebin",
 "/usr/local/lib/erlang/lib/public_key-1.11.3/ebin",
 "/usr/local/lib/erlang/lib/parsetools-2.3.2/ebin",
 "/usr/local/lib/erlang/lib/os_mon-2.7.1/ebin",
 "/usr/local/lib/erlang/lib/odbc-2.13.5/ebin",
 "/usr/local/lib/erlang/lib/observer-2.10.1/ebin",
 "/usr/local/lib/erlang/lib/mnesia-4.20.1/ebin",
 "/usr/local/lib/erlang/lib/megaco-4.2/ebin",
 "/usr/local/lib/erlang/lib/inets-7.5/ebin",
 "/usr/local/lib/erlang/lib/hipe-4.0.1/ebin",
 "/usr/local/lib/erlang/lib/ftp-1.1/ebin",
 "/usr/local/lib/erlang/lib/eunit-2.7/ebin",
 "/usr/local/lib/erlang/lib/et-1.6.5/ebin",
 "/usr/local/lib/erlang/lib/erts-12.2/ebin",
 [...]|...]
2> c(module2).
{ok,module2}
3> c(module1).
Recompiling /home/nalin/source/erlang/part2/../part1/module1.erl
{ok,module1}
4> module2:exec().
"Module2"
5> module1:exec().
"Module1"
6>

我希望这些足以让您继续前进。此外,您必须抓住机会通读 Compilation and Code Loading 以了解发生的事情。



WYSIWYG => WHAT YOU SHOW IS WHAT YOU GET