これはスコープの問題です。ブロック内では、次のエイリアスが定義されています。
if Code.ensure_loaded?(MyApp.Repo) do
alias MyApp.Repo
Repo.get(...) #⇒ available
end
IEx 全体を定義するalias
には、ブロックの外で呼び出す必要があります。
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