code:add_path 和在命令行上使用 -pa 有什么区别?

Don*_*son 2 erlang erlang-otp

这是我的 .erlang 文件:

code:add_path("/home/root/projects/myapp/ebin").
code:add_path("/home/root/projects/esmtp/ebin").
application:load(esmtp),
application:set_env(esmtp, smarthost, {"localhost",25}),
application:set_env(esmtp, default_from, "<stuff>"),
application:start(esmtp).
Run Code Online (Sandbox Code Playgroud)

当我跑步时:

erl -boot myapp 
Run Code Online (Sandbox Code Playgroud)

它失败:

{"init terminating in do_boot",{'cannot get bootfile','myapp.boot'}}

Crash dump was written to: erl_crash.dump
init terminating in do_boot ()
Run Code Online (Sandbox Code Playgroud)

但如果我跑:

erl -boot myapp -pa /home/root/projects/myapp/ebin
Run Code Online (Sandbox Code Playgroud)

效果很好。这让我相信命令行上的 -pa 与 .erlang 文件中的 code:add_path() 的处理方式不同。我知道 .erlang 文件有效,因为 esmtp 加载并正确运行。-pa 和 code:add_path() 有什么区别?

Luk*_*kas 5

.erlang文件是在引导文件加载后读取并执行的,所以erlang在寻找引导文件时还没有添加路径。

另一方面,-pa 是在虚拟机开始查找引导文件之前添加的,以便找到引导文件。