加载路径中的所有 erlang 模块

Posted

技术标签:

【中文标题】加载路径中的所有 erlang 模块【英文标题】:Load all erlang modules in path 【发布时间】:2011-10-18 21:43:32 【问题描述】:

使用来自Easy way of loading projects with rebar dependencies 的答案,现在会自动解决依赖关系,但不会自动加载它们。

那么,如何自动加载我的 ebin 和 /deps/*/bin 路径中的所有模块?这样,在使用 Erlang shell 选项卡补全时就可以使用它们,这大大加快了我的开发过程。

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

【问题讨论】:

【参考方案1】:

这个 sn-p 可以解决问题:

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

将它作为一行放在你的~/.erlang 文件中(包括点:.),它将在启动 any 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 

【讨论】:

Tnx,为了方便起见,我很乐意用一些前期性能进行交易。 是的,在第一次按 TAB 时自动加载模块会很酷。 :-)【参考方案2】:

如果您生成该进程,您将获得一个非常快速的启动。

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 文件中

【讨论】:

@VansS 确保shell可以在按下Tab键时自动完成模块和函数名称。 @Adam Lindberg 对。在这个特定问题的范围内,以这种方式使用 ensure_loaded 是有意义的。

以上是关于加载路径中的所有 erlang 模块的主要内容,如果未能解决你的问题,请参考以下文章

如何在Elixir或Erlang中在运行时动态创建和加载模块?

Erlang模块与Erlang程序的运行方法

Erlang热门代码加载

如何在erlang中应用热代码交换功能作为补丁?

Elixir重命名并包装Erlang模块?

更改 Erlang 中的默认“home”路径以解决 RabbitMQ 启动错误