elixir – Phoenix live reload在编译错误时中断

偶尔,当我发现错字在我的药剂代码和CompileError发生,凤凰拒绝甚至一度我都固定住重装,并保持印刷App.Endpoint.path / 1未定义(应用程序为我的应用程序).当然,端点定义完全正常,一旦我重新启动mix phoenix.server就可以再次工作.

据我所知,我正在使用最新版本的所有内容.由于我在网上找不到任何关于这个错误的信息,我怀疑我错误配置了一些东西,我很感激你对如何追查这个错误的建议.

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

最佳答案 看来Phoenix的实时重载功能是Endpoint的一部分,所以一旦后者崩溃,代码重新加载就不再起作用了.

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

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

我找到的最好的解决方法 – 直到Absinthe开发人员设法使解析器独立于defs类型(他们已经建议他们将 – )是使用iex -S mix phoenix.server启动服务器,并在每次调用时手动运行重新编译端点崩溃.虽然这并没有解决CodeReloader作为Endpoint的一部分而不是反过来的根本问题,但它使我不必每次都重新运行webpack,这是最大的痛点.

点赞