这是范围界定的问题。在一个块中,您定义了这个别名:
if Code.ensure_loaded?(MyApp.Repo) do
alias MyApp.Repo
Repo.get(...) #⇒ available
end
要定义alias
IEx 范围,您应该在任何块之外调用它:
alias MyApp.Repo
if Code.ensure_loaded?(MyApp.Repo)
当IEx
使用 执行时,您不需要条件iex -S mix
,所有依赖项都会自动为您加载。对于纯iex
,这可能会以更麻烦的方式完成:
defmodule FileExt do
def ls_all(dir, acc \\ []) do
case File.ls(dir) do
{:ok, list} -> list |> Enum.reduce(acc, fn f, acc ->
fullname = dir <> "/" <> f
if fullname |> File.dir?, do: ls_all(fullname, acc), else: acc ++ [fullname]
end)
{:error, e} ->
IO.puts "Unable to list. Reason: #{e}"
acc
end
end
def require_lib do
try do
"lib" |> FileExt.ls_all |> Kernel.ParallelRequire.files
rescue
e in UndefinedFunctionError -> Code.ensure_loaded?(MyApp.Repo)
end
end
end
try do
MyApp.Repo.get
rescue
e in UndefinedFunctionError -> FileExt.require_lib
end
alias MyApp.Repo
以上将加载"lib"
目录中的所有文件。
虽然我会在这里关闭完美主义并iex -S mix
一直使用,无需检查:
Code.ensure_loaded?(MyApp.Repo)
alias MyApp.Repo