Phoenix持久化构建问题:依赖每次都会重新编译
解决Elixir本地开发每次重新编译所有依赖的问题
可能的原因及排查方案
1. 文件系统时间同步问题
本地文件系统的时间戳与Elixir构建系统的检测逻辑不匹配,会导致每次都判定文件存在变更。比如Windows/WSL环境、跨平台文件共享场景下,时间戳常出现偏差。
- 检查项目目录下
_build/dev/lib文件夹内依赖的.beam文件时间戳,确认是否每次操作后都会被修改 - 若使用WSL,将项目放在WSL原生文件系统内,避免存放在Windows挂载的目录中
2. 构建目录权限异常
本地_build或deps目录的权限设置错误,会导致Elixir无法正确缓存编译状态。
- Linux/macOS环境下执行
sudo chown -R $USER:$USER .,确保当前用户拥有项目目录的完整权限 - 删除
_build和deps目录,重新执行mix deps.get && mix compile
3. Mix配置中的强制编译选项
检查config/dev.exs内是否存在强制重新编译的配置,这类设置会直接跳过缓存检测。
- 查看配置文件中是否有类似代码:
若存在,注释掉该配置config :elixir, :compiler, force: true
4. 依赖版本锁定异常
mix.lock文件损坏或依赖引用方式不当,会导致依赖频繁触发重新编译。
- 删除
mix.lock文件,重新执行mix deps.get生成新的锁定文件 - 检查是否有依赖使用
:path或:git本地路径引用,这类依赖会被高频检测变更
5. 持久化构建的正确使用方式
mix compile --persistent需要配合守护进程运行,单独执行一次无法保留缓存状态:
- 启动持久化编译守护进程:
mix compile --persistent - 保持该进程后台运行,后续所有mix命令都会复用此编译缓存
6. 本地系统的文件监控干扰
Docker容器内文件系统更稳定,而本地可能有工具干扰文件状态:
- 关闭自动备份工具(如Time Machine、Dropbox)对项目目录的同步
- 检查IDE的自动格式化、文件监控类插件,确认是否在频繁修改项目文件
内容的提问来源于stack exchange,提问作者Ukasha
相关产品推荐
相关产品推荐

