加载路径中的所有 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 模块的主要内容,如果未能解决你的问题,请参考以下文章