Elixir 代码。是否已加载?in.iex.exs
我的elixir控制台配置存储在Elixir 代码。是否已加载?in.iex.exs,elixir,elixir-iex,Elixir,Elixir Iex,我的elixir控制台配置存储在.iex.exs中: if Code.ensure_loaded?(MyApp.Repo) do alias MyApp.Repo end 我希望能够同时运行iex和iex-S mix。如果我在iex上删除条件,则会出现异常 但是这种情况不太好用!即使在iex-S mix上我也有(模块Repo不可用)错误,如果我试图调用Repo.get(…)。因此,我的问题是: 为什么代码。确保\u已加载?在这里不起作用 我怎样才能解决这个问题 这是一个范围界定的问题。在块
.iex.exs
中:
if Code.ensure_loaded?(MyApp.Repo) do
alias MyApp.Repo
end
我希望能够同时运行iex
和iex-S mix
。如果我在iex
上删除条件,则会出现异常
但是这种情况不太好用!即使在iex-S mix上
我也有(模块Repo不可用)
错误,如果我试图调用Repo.get(…)
。因此,我的问题是:
代码。确保\u已加载?
在这里不起作用这是一个范围界定的问题。在块内,定义了以下别名:
if Code.ensure_loaded?(MyApp.Repo) do
alias MyApp.Repo
Repo.get(...) #⇒ available
end
要定义IEx范围的别名
IEx,应在任何块之外调用它:
alias MyApp.Repo
如果是代码,则不需要有条件的。确保加载?(MyApp.Repo)
当使用IEx-S mix执行IEx
时,将自动加载所有依赖项。对于纯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
这是一个范围界定的问题。在块内,定义了以下别名:
if Code.ensure_loaded?(MyApp.Repo) do
alias MyApp.Repo
Repo.get(...) #⇒ available
end
要定义IEx范围的别名
IEx,应在任何块之外调用它:
alias MyApp.Repo
如果是代码,则不需要有条件的。确保加载?(MyApp.Repo)
当使用IEx-S mix执行IEx
时,将自动加载所有依赖项。对于纯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
(1) 是因为别名
是词法性的,仅在if
中有效。不确定(2)。(1)是因为别名是词法性的,并且仅在中有效(如果)。关于(2)我不确定。我不认为这解决了“我想同时运行iex
和iex-S mix
”的要求@Dogbert确实,我更新了一个答案,显式加载“lib”
目录。@mudasobwa看起来不错,但我得到了很多警告,比如警告:重新定义模块MyApp.module
。如何解决?您在使用FileExt.ls|all |>Kernel.ParallelRequire.files
和iex-S mix
时收到这些警告,对吗?显然,这是因为iex-smix
负责从“lib”
本身加载所有内容。检查是否预先定义了Repo
,以区分纯iex
和iex-S mix
之间的行为:尝试执行MyApp.Repo.get rescue e in UndefinedFunctionError->LOAD_ALL_THIS_STUFF end
@mudasobwa我仍然看到这些警告;只需复制粘贴的代码并用我的应用程序名替换MyApp
,我认为这并不能解决“我希望能够同时运行iex
和iex-S mix
”的要求@Dogbert确实,我更新了一个答案,以显式加载“lib”
dir.@mudasobwa看起来不错,但我收到了很多警告,类似于警告:重新定义模块MyApp.module
。如何解决?您在使用FileExt.ls|all |>Kernel.ParallelRequire.files
和iex-S mix
时收到这些警告,对吗?显然,这是因为iex-smix
负责从“lib”
本身加载所有内容。检查是否预先定义了Repo
,以区分纯iex
和iex-S mix
之间的行为:尝试执行MyApp.Repo.get rescue e in UndefinedFunctionError->LOAD_ALL_THIS_STUFF end
@mudasobwa我仍然看到这些警告;只需复制粘贴的代码并用我的应用程序名替换MyApp