如何在开发 OTP 应用程序时重新加载所有 OTP 代码?

How to reload all OTP code when developing an OTP application?

在我学习 OTP 的同时,我一直在对 .app 和 .erl 文件进行大量更改,并重新运行我的应用程序以查看更改的效果。

我尝试了以下命令序列来获取我所有的新更改,但它似乎不起作用:

编译src文件...

erlc -o ebin src/*.erl

...后面跟着的是erlang shell:

application:stop(my_app).
application:unload(my_app).
application:load(my_app).
application:start(my_app).

但是,这似乎不起作用。我发现唯一可行的方法是退出 erlang shell,重新编译应用程序,然后 运行 application:start(my_app)..

是否有更简单的方法来获取我的更改?

调用 application:load(App)(在停止和卸载之后)将重新加载 .app 文件而不是模块。正如文档所说:“请注意,该函数不会加载实际的 Erlang 对象代码。”

如果您要使用版本进行升级,您将发布一个 .appup 文件,该文件指定在升级到新版本时要重新加载哪些模块(如果只有一个或两个更改,则无需重新加载所有模块) ,但如果您只是在开发并且不想停止并重新启动所有内容,则必须设置自己的帮助函数以重新加载代码。

编辑:自 OTP 20 (2017) 以来,交互式 Erlang shell 现在具有 lm() 函数,用于加载其 .beam 文件已更改的所有模块,因此无需滚动您自己的实用程序不再为此功能。参见 https://erlang.org/doc/man/c.html#lm-0