1

我有一个长生不老药控制台配置存储在.iex.exs

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

我希望有能力同时运行iexiex -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

要定义aliasIEx 范围,您应该在任何块之外调用它:

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