1

に保存されているエリクサーコンソール構成があります.iex.exs

if Code.ensure_loaded?(MyApp.Repo) do
  alias MyApp.Repo
end

と の両方を実行する機能が必要iexですiex -S mix。の条件を削除すると例外が発生しますiex

しかし、この条件はうまくいきません!を呼び出そうとしてもエラーがiex -S mix発生します。だから、私の質問は次のとおりです。(module Repo is not available)Repo.get(...)

  1. Code.ensure_loaded?ここで機能しないのはなぜですか?
  2. どうすれば修正できますか?
4

1 に答える 1

0

これはスコープの問題です。ブロック内では、次のエイリアスが定義されています。

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)場合、条件は必要ありません。すべての依存関係が自動的に読み込まれます。純粋な場合、これはより面倒な方法で行うことができます:IExiex -S mixiex

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
于 2016-09-15T05:41:49.773 に答える