【发布时间】:2017-09-11 02:44:05
【问题描述】:
我正在使用带有 Cowboy 和 Sync 的 Erlang.mk 构建一个应用程序。除了fragments_app(片段是我的项目名称)之外,重新编译对大多数模块都非常有效。我在那里有一个路由配置,当我更改它(例如添加新路由)时,我会收到有关重新编译模块的通知:
=INFO REPORT==== 14-Apr-2017::19:56:59 ===
/app/src/fragments_app.erl:0: Recompiled.
=INFO REPORT==== 14-Apr-2017::19:56:59 ===
fragments_app: Reloaded! (Beam changed.)
但似乎没有应用更改:
$ http :8080/fragments
HTTP/1.1 404 Not Found
content-length: 0
date: Fri, 14 Apr 2017 19:35:27 GMT
server: Cowboy
也在控制台中重新加载模块
c:l(fragments_app).
没有帮助,也没有执行
sync:go().
如果我停止应用程序并重新启动它,它会按预期工作。
同时更新处理程序似乎立即生效 - 同步正在获取它,并且无需重新启动应用程序即可生效。
这里是修改后fragments_app.erl的来源:
-module(fragments_app).
-behaviour(application).
-export([start/2]).
-export([stop/1]).
start(_Type, _Args) ->
Dispatch = cowboy_router:compile([
{ '_', [
{ "/fragments", fragments_http_handler, [] }
]}
]),
{ ok, _ } = cowboy:start_clear(fragments_http_listener, 100,
[{ port, 8080 }],
#{ env => #{ dispatch => Dispatch }}
),
fragments_sup:start_link().
stop(_State) ->
ok.
我的 Makefile:
PROJECT = fragments
PROJECT_DESCRIPTION = New project
PROJECT_VERSION = 0.1.0
DEPS = cowboy sync
dep_cowboy_commit = master
DEP_PLUGINS = cowboy
SP = 2
include erlang.mk
和 relx.config:
{release, {fragments_release, "1"}, [fragments, sasl, runtime_tools]}.
{extended_start_script, true}.
{sys_config, "rel/sys.config"}.
{vm_args, "rel/vm.args"}.
{dev_mode, true}.
为什么会这样?我可以做些什么来应用我的更改而不重新启动应用程序?
【问题讨论】:
-
查看这里进行一些(正在进行的)讨论:twitter.com/lhoguin/status/852986294896664576