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

Elixir应用iex运行正常但mix run时报Repo模块不存在错误

问题根因

报错核心是两个触发条件叠加:

  1. 执行mix run lib/wtf.ex时,Mix仅会加载你传入的这一个脚本文件,不会自动触发完整的OTP应用启动流程:你配置在监督树里的Wtf.Repo进程不会被拉起,config.exs里的数据库配置也不会被自动注入到运行环境。
  2. 你业务代码里调用的是裸写的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 19:06:33