如何自动加载一个目录中的所有Erlang模块?

im9ewurl  于 2022-12-20  发布在  Erlang
关注(0)|答案(2)|浏览(254)

使用加载具有Rebar依赖项的项目的简单方法中的答案,依赖项现在可以自动解析,但不会自动加载。
那么,如何自动加载ebin和/deps/*/bin路径中的所有模块呢?这样,在使用Erlangshell制表符完成时,这些模块都可用,这大大加快了我的开发过程。

我的解决方案基于Adam Lindberg的伟大回答https://gist.github.com/1131312它只会自动加载项目模块,因此在erl启动时几乎没有延迟。

lokaqttq

lokaqttq1#

下面的代码片段就可以做到这一点:

[code:ensure_loaded(list_to_atom(filename:rootname(filename:basename(F))))
 || P <- code:get_path(), F <- filelib:wildcard(P ++ "/*.beam")].

将其作为一行放入~/.erlang文件(包括点:.),它将在启动 * 任意 * Erlang shell时执行。但要注意,它慢得可怕!

» time erl -noshell -s init stop
erl -noshell -s init stop  0.11s user 0.02s system 11% cpu 1.143 total # Without
» time erl -noshell -s init stop
erl -noshell -s init stop  7.31s user 1.08s system 88% cpu 9.480 total # With
0x6upsns

0x6upsns2#

如果您生成该进程,您将获得一个非常快的开始。

LP = fun() -> [code:ensure_loaded(list_to_atom(filename:rootname(filename:basename(F)))) || P <- code:get_path(), F <- filelib:wildcard(P ++ "/*.beam")] end.
spawn(LP).

在~/.erlang文件中

相关问题