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

时间:2014-12-17 21:31:57

标签: erlang vi cowboy

我正在开发Cowboy和erlang.mk,目前我的流程是: 1.在vi中更改代码,保存,运行make 2.关闭牛仔,再次启动牛仔(我在控制台模式下运行牛仔以进行跟踪/调试)

有没有办法让Cowboy重新加载并自动重启,并尽可能少地延迟?我知道我可以添加牛仔停止并开始我的makefile但也许有更好/更敏感的方式?

我看到有来自rustyio的同步软件包,但是直接将它挂钩到我的应用程序中似乎过于复杂。

4 个答案:

答案 0 :(得分:1)

您还可以在运行Erlang版本的同时将relx和rusty / sync结合使用以进行代码重新加载。它就像魅力一样,并且有关于如何进行这种设置的教程。

答案 1 :(得分:1)

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

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

我使用.erlang文件,通常放在src / .erlang中,并带有以下两行

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

现在,每当我保存文件时,都会重新加载。我认为没有理由认为这不适合牛仔

答案 2 :(得分:0)

查看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).

它试图以安全的方式循环使用新代码。

答案 3 :(得分:0)

Rustyio 对于临时(sideproject)使用来说确实有点复杂。大多数方法侧重于 rebar3。

对于 erlang.mk 用户,reload.mk plugin 运行良好。只需将其添加到 Makefile deps 中,使用 make run RELOADABLE=1 运行程序并使用 make reload 重新加载。