【问题标题】:Phoenix live reload breaks on compilation errorPhoenix live reload 因编译错误而中断
【发布时间】:2016-08-12 08:37:56
【问题描述】:

有时,当我在 Elixir 代码中打错字并出现 CompileError 时,即使我修复了所有内容,Phoenix 也拒绝实时重新加载,并继续打印 App.Endpoint.path/1 is undefinedApp 是我的应用程序)。当然,端点 定义得非常好,一旦我重新启动mix phoenix.server,它就会再次工作。

据我所知,我使用的是最新版本的一切。由于我在网上找不到有关此错误的任何信息,因此我怀疑我配置错误,感谢您就如何追查其根源提出的建议。

[info] Sent 200 in 200ms
iex[debug] Live reload: web/resolver/reviewer.ex
[debug] Live reload: web/resolver/reviewer.ex
Compiling 20 files (.ex)

== Compilation error on file web/resolver/reviewer.ex ==
** (Ecto.Query.CompileError) unbound variable `f` in query
    (ecto) expanding macro: Ecto.Query.preload/3
    (app) web/resolver/reviewer.ex:519: App.Resolver.Reviewer.sc_data/1
    (elixir) expanding macro: Kernel.|>/2
    (app) web/resolver/reviewer.ex:520: App.Resolver.Reviewer.sc_data/1
    (elixir) lib/kernel/parallel_compiler.ex:116: anonymous fn/4 in Kernel.ParallelCompiler.spawn_compilers/1

[error] #PID<0.2279.0> running App.Endpoint terminated
Server: localhost:4000 (http)
Request: GET /reviewers/2016/1234
** (exit) an exception was raised:
    ** (UndefinedFunctionError) function App.Endpoint.path/1 is undefined (module App.Endpoint is not available)
        (app) App.Endpoint.path("/phoenix/live_reload/frame")
        (phoenix_live_reload) lib/phoenix_live_reload/live_reloader.ex:115: Phoenix.LiveReloader.reload_assets_tag/1
        (phoenix_live_reload) lib/phoenix_live_reload/live_reloader.ex:97: anonymous fn/1 in Phoenix.LiveReloader.before_send_inject_reloader/1
        (elixir) lib/enum.ex:1623: Enum."-reduce/3-lists^foldl/2-0-"/3
        (plug) lib/plug/conn.ex:909: Plug.Conn.run_before_send/2
        (plug) lib/plug/conn.ex:355: Plug.Conn.send_resp/1
        (phoenix) lib/phoenix/code_reloader.ex:50: Phoenix.CodeReloader.call/2
        (app) lib/app/endpoint.ex:1: App.Endpoint.phoenix_pipeline/1
        (app) lib/plug/debugger.ex:93: App.Endpoint."call (overridable 3)"/2
        (app) lib/app/endpoint.ex:1: App.Endpoint.call/2
        (plug) lib/plug/adapters/cowboy/handler.ex:15: Plug.Adapters.Cowboy.Handler.upgrade/4
        (cowboy) src/cowboy_protocol.erl:442: :cowboy_protocol.execute/4
[error] Ranch protocol #PID<0.2281.0> (:cowboy_protocol) of listener App.Endpoint.HTTP terminated
** (exit) killed
Compiling 20 files (.ex)

== Compilation error on file web/resolver/reviewer.ex ==
** (Ecto.Query.CompileError) unbound variable `f` in query
    (ecto) expanding macro: Ecto.Query.preload/3
    (app) web/resolver/reviewer.ex:519: App.Resolver.Reviewer.sc_data/1
    (elixir) expanding macro: Kernel.|>/2
    (app) web/resolver/reviewer.ex:520: App.Resolver.Reviewer.sc_data/1
    (elixir) lib/kernel/parallel_compiler.ex:116: anonymous fn/4 in Kernel.ParallelCompiler.spawn_compilers/1

^C
BREAK: (a)bort (c)ontinue (p)roc info (i)nfo (l)oaded
       (v)ersion (k)ill (D)b-tables (d)istribution

【问题讨论】:

  • 也许可以完全确定,您的端点没问题,只需附加它。
  • 好的,所以端点似乎实际上已经死了。我偶尔也会收到** (exit) an exception was raised: ** (UndefinedFunctionError) function App.Endpoint.call/2 is undefined (module App.Endpoint is not available)。一个端点怎么会死掉而不被主管重新启动?
  • 您的端点是使用Phoenix.endpoint 还是您最近更改了应用程序的名称并且端点也没有更改?

标签: elixir phoenix-framework


【解决方案1】:

Phoenix 的实时重新加载功能似乎是 Endpoint 的一部分,因此一旦后者崩溃,代码重新加载就不再起作用了。

在 Endpoint 下的代码中插入错误可能会导致 Endpoint 崩溃,例如通过添加plug :some_imaginary_plug 或导致router.ex 中的语法错误,因为路由器也插入了端点。

现在,事实证明我正在使用 Absinthe 包,通过 forward 直接向 Absinthe 插件发送所有 /graphql 请求。因此,任何 GraphQL 类型定义和相关的 resolver 函数(恰好构成了我的大部分应用程序)都是脆弱的:任何不显眼的 CompileError 由于它们间接(但不可避免地)导致端点崩溃。

我发现最好的解决方法——直到 Absinthe 开发者设法使解析器独立于类型定义,他们建议他们这样做——是用iex -S mix phoenix.server 启动服务器,并在任何时候手动运行recompile端点崩溃。虽然这并不能解决 CodeReloader 作为 Endpoint 的一部分而不是反之亦然的潜在问题,但它使我不必每次都重新运行 webpack,这是最大的痛点。

【讨论】:

  • 嘿,感谢您深入研究。我想这是您对 Phoenix 的问题:github.com/phoenixframework/phoenix/issues/1845 这有没有得到解决?凤凰城或苦艾酒有我可以追踪的票吗?手动运行recompile 仍然是最好的选择吗?
  • 嘿,很抱歉回复晚了——我不记得最后发生了什么,但我已经很长时间没有看到这个错误了,所以我认为 Absinthe 开发人员已经修复了它?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-21
  • 1970-01-01
  • 2013-04-20
  • 2021-05-17
  • 2015-11-23
  • 1970-01-01
相关资源
最近更新 更多