【问题标题】:How to reload all OTP code when developing an OTP application?开发 OTP 应用程序时如何重新加载所有 OTP 代码?
【发布时间】:2015-05-16 19:23:20
【问题描述】:

在学习 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).

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

【问题讨论】:

  • 看看mochiweb reloader。一旦启动,进程会检测重新编译的文件并自动重新加载它。建议仅用于开发阶段。
  • 通常我一次只更改一两个模块并重新加载。为此,只需执行c(module) 就足够了。如果您的代码被构造为 OTP 应用程序,那么运行 make:all() 非常方便(您需要一个 Emakefile,但基本的文件是 1 或 2 行 erlang.org/doc/man/make.html)。

标签: erlang erlang-shell


【解决方案1】:

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

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

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

【讨论】:

  • 在学习阶段,我认为是相当少量的代码模块,你可能只是一次修改一两个,随着你的感觉,简单地编译和正如@RichardC 在他的回答中显示的那样,直接使用c:l(Module) 加载更改的模块可能就是您需要做的所有事情来引入您的更改以进行测试,除非您正在修改环境变量或其他一些应用程序级参数。跨度>
  • @snwight:是的,我现在只在学习几个模块。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-10-30
  • 2015-05-12
  • 1970-01-01
  • 1970-01-01
  • 2022-12-06
  • 2011-07-13
  • 2017-09-22
相关资源
最近更新 更多