erlang 在使用Cowboy进行开发时,如何进行热代码重新加载?

qlzsbp2j  于 2022-12-08  发布在  Erlang
关注(0)|答案(4)|浏览(178)

我正在使用Cowboy和www.example.com进行开发erlang.mk,目前我的流程是:1.在vi中更改代码,保存,运行make 2.关闭Cowboy,再次启动Cowboy(我在控制台模式下运行Cowboy,用于跟踪/调试)
有没有办法让Cowboy自动重新加载和重新启动,并且尽可能地减少延迟?我知道我可以在我的makefile中添加Cowboy stop和start,但是也许有一种更好/响应更快的方法?
我看到有同步包从rustyio,但它似乎过于复杂,必须挂钩到我的应用程序直接。

cedebl8k

cedebl8k1#

我一直都在使用rebar。在rebar.config中,我有

{deps,[
        {sync,         ".*", {git, "git://github.com/rustyio/sync", {tag,"master"}}},
 }

我使用一个.erlang文件,通常放在src/.erlang中,并包含以下两行

code:add_path("../deps/sync/ebin").
 sync:go().

现在,每当我保存一个文件时,它就会被重新加载。我看不出有什么理由不适合Cowboy

hgtggwj0

hgtggwj02#

您可以合并relx和rusty/sync进行代码重新加载,同时仍然运行Erlang发行版。它的工作原理就像charm一样,并且有关于如何进行这样的设置的教程。

jtoj6r0c

jtoj6r0c3#

看一看p6hot_deploy.erl
它每秒扫描一次文件系统,寻找日期发生变化的模块,然后重新加载它们。
因此您的流程将是:编辑,保存,制作
此模块将查看文件更改并强制重新加载
这不是用释放和东西花哨的OTP方式,而是一个更低级别的简单代码交换。
注意:你必须改变它来为你工作,因为它依赖于我的日志宏和东西,但是你应该通过查看它来获得要点。
关键部分是这个函数:

reload(Module) ->
    case code:purge(Module) of
        true -> ?lwarn("Process killed as result of reloading: ~p",[Module]);
        false -> ok
    end,
    code:load_file(Module).

它尝试以安全的方式在新代码中循环。

oyjwcjzk

oyjwcjzk4#

Rustyio is indeed a bit complicated for casual (sideproject) use. Most methods focus on rebar3.
For erlang.mk users, the reload.mk plugin works well. Just add it in the Makefile deps, run programs with make run RELOADABLE=1 and reload with make reload .

相关问题