You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Phoenix Umbrella应用中app模块代码无法热重载的排查咨询

我之前维护Phoenix伞形项目时也碰到过一模一样的问题,给你梳理几个实用的排查方向,应该能帮你定位到问题:

排查Phoenix Umbrella中app模块热重载失效的步骤

1. 先检查app_web对app模块的依赖配置

首先得确认app_web/mix.exs里对app的依赖是不是正确配置了dev环境的监听参数。你要确保依赖里加了in_umbrella: true(表明是伞形项目内的子应用),同时加上runtime: true和env: :dev,这样dev环境下才会实时监听app模块的代码变化。示例配置应该是这样的:

defp deps do
  [
    {:app, in_umbrella: true, runtime: true, env: :dev}
  ]
end

要是没加runtime: true,Phoenix在dev模式下可能不会把app模块纳入热重载的监听范围。

2. 验证Phoenix代码监听器的配置

Phoenix的热重载是靠Phoenix.CodeReloader实现的,你得去app_web/config/dev.exs里检查端点配置,确保reloadable_apps列表里包含了:app模块。比如:

config :app_web, AppWeb.Endpoint,
  code_reloader: true,
  reloadable_apps: [:app_web, :app], # 这里必须把:app加进去
  # 其他配置...

如果这个列表里只有:app_web,那自然不会监听app模块的代码修改。

3. 确认app模块的编译与启动配置

打开app/mix.exs,检查project部分的配置:

  • 确保start_permanent只在prod环境下设为true,也就是start_permanent: Mix.env() == :prod。要是dev环境下也设成了true,进程会永久运行,代码修改后没法自动重启重载。
  • 不要随便修改compilers配置,保持默认的Mix.compilers()就行,不然可能破坏dev环境的增量编译逻辑。

另外,还要看app/lib/application.ex里的启动配置,如果app模块里有自定义的GenServer、Worker之类的进程,要确保它们的重启策略是:one_for_one这类允许重启的模式,而不是:never。不然代码重载时进程不会重启,修改后的代码就没法生效。

4. 检查mix命令的运行路径

你是不是在伞形项目的根目录运行mix phx.server?要是只在app_web子目录下启动服务器,mix只会监听app_web的代码变化,不会管app模块的。一定要回到项目根目录执行启动命令才行。

5. 清理编译缓存试试

有时候编译缓存会搞鬼,导致热重载失效。你可以试试删除根目录下的_build和deps文件夹,然后重新跑mix deps.get和mix compile,再启动服务器看看。


内容的提问来源于stack exchange,提问作者Chris

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 12:30:12