【问题标题】:How to Stop Forced Module Namespace in Elixir Phoenix iex Console?如何在 Elixir Phoenix iex 控制台中停止强制模块命名空间?
【发布时间】:2019-01-11 16:22:59
【问题描述】:

在我的 Phoenix 应用程序中使用 iex 控制台时,如下所示:

iex -S mix phx.server

我似乎无法调用 System 函数,例如 System.stop(1)System.halt(1),因为它会将命名空间强制到模块的前面。由于该命名空间模块不存在而导致错误。

** (UndefinedFunctionError) function MyApp.SomeNamespace.System.stop/1 is undefined or private

为什么要在这个核心模块前面加上一个命名空间?为什么像 System 这样的模块会产生这个错误,而像 EnumListMap 这样的模块却不会产生这个错误?

另外,如果我在我的应用程序源之外使用iex,我可以按预期调用System.any_function

在进一步检查后,我可以通过调用 Elixir.System.stop/1 使其工作。为什么我需要在 System 模块前面加上 Elixir. 而我不需要为其他 Elixir 模块这样做?

在我的应用程序代码中,我调用 System.backtraceSystem.get_env 之类的东西,不需要别名或命名空间。我在应用程序中也没有名为 System 的模块(即,没有定义 Myapp.System 或类似的模块)。

【问题讨论】:

  • 检查您是否在某处存在.iex.exs 文件。
  • @OnorioCatenacci 确实,该文件存在,我发现其中的一些代码似乎是我观察到的行为的罪魁祸首。谢谢!我不知道这种配置文件。您认为您可以从中得出答案吗?

标签: namespaces elixir phoenix dotfiles elixir-iex


【解决方案1】:

查找 iex.exs 文件。如果有这样的文件,它会在 iex 运行时自动运行。如果您在 iex.exs 中引用可以解释此行为的命名空间。

您可以在文档https://hexdocs.pm/iex/IEx.html#module-the-iex-exs-file中找到更多信息

【讨论】:

  • 这确实是我观察到的行为的根源!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-03-22
  • 2023-04-04
  • 2016-04-02
  • 1970-01-01
  • 2017-03-25
  • 2011-01-14
  • 2012-02-17
相关资源
最近更新 更多