【问题标题】:How can I do hot code reload when developing with Cowboy?使用 Cowboy 开发时如何进行热代码重载?
【发布时间】:2015-02-16 13:38:43
【问题描述】:

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

有没有办法让 Cowboy 以尽可能少的延迟自动重新加载和重新启动?我知道我可以将 Cowboy stop 和 start 添加到我的 makefile 但也许有更好/响应更快的方式?

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

【问题讨论】:

    标签: erlang vi cowboy


    【解决方案1】:

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

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

    我用的是.erlang文件,一般放在src/.erlang里面有以下两行

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

    现在,每当我保存文件时,它都会重新加载。我看不出为什么这对 Cowboy 不起作用

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        【解决方案3】:

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

        它尝试以安全的方式循环输入新代码。

        【讨论】:

          【解决方案4】:

          Rustyio 对于休闲(副项目)使用确实有点复杂。大多数方法都集中在 rebar3 上。

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

          【讨论】:

            猜你喜欢
            • 2021-07-25
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2021-03-22
            • 2018-11-06
            • 2021-01-02
            • 2020-02-18
            • 2019-04-26
            相关资源
            最近更新 更多