Elixir应用iex运行正常但mix run时报Repo模块不存在错误
问题根因
报错核心是两个触发条件叠加:
- 执行
mix run lib/wtf.ex时,Mix仅会加载你传入的这一个脚本文件,不会自动触发完整的OTP应用启动流程:你配置在监督树里的Wtf.Repo进程不会被拉起,config.exs里的数据库配置也不会被自动注入到运行环境。 - 你业务代码里调用的是裸写的
Repo.all/1,没有写完整模块名Wtf.Repo.all/1;单脚本加载场景下,你在模块内定义的别名、项目全局的模块绑定都不会自动生效,虚拟机自然找不到名为Repo的可用模块。
你用iex -S mix启动时流程是正常的:这个命令会默认执行全量应用启动逻辑,加载所有配置、拉起监督树全部子进程、完成所有模块的别名注册,所以直接调用Wtf.Repo.all(Wtf.Data)能正常返回数据,CRUD操作也无异常。
修复方案
常规业务场景(推荐)
不要直接把lib目录下的业务模块文件路径传给mix run执行,通过-e参数指定要运行的函数入口即可,这个方式会和iex启动一样走完整应用加载流程:
# 假设你Wtf模块里写的查询函数叫list_data,替换成你实际的函数名即可 mix run -e "Wtf.list_data()"
执行前确认你业务模块内的Repo别名是写在模块定义内部,类似:
defmodule Wtf do # 别名写在模块内部,模块加载时会自动生效 alias Wtf.Repo def list_data do Repo.all(Wtf.Data) end end
单脚本独立运行场景(不推荐)
如果你确实要直接执行lib/wtf.ex单文件,需要在文件最开头手动补全启动逻辑,同时把所有裸写的Repo调用替换为完整模块路径:
# 文件最开头加以下启动代码 Mix.install([:postgrex, :ecto, :ecto_sql]) Code.eval_file("config/config.exs") Application.ensure_all_started(:wtf) # 后续业务逻辑里所有Repo调用要写全模块名 Wtf.Repo.all(Wtf.Data)
内容的提问来源于stack exchange,提问作者noname
相关产品推荐
相关产品推荐

