如何在 Elixir Phoenix iex 控制台中停止强制模块命名空间?
How to Stop Forced Module Namespace in Elixir Phoenix iex Console?
从我的 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
之类的模块会产生此错误,而 Enum
、List
或 Map
之类的模块则不会?
此外,如果我在我的应用程序源之外使用 iex
,我可以按预期调用 System.any_function
。
经过进一步检查,我可以通过调用 Elixir.System.stop/1
使其正常工作。为什么我需要在 System
模块前面加上 Elixir.
但我不需要为其他 Elixir 模块这样做?
在我的应用程序代码中,我调用 System.backtrace
或 System.get_env
之类的东西,不需要别名或命名空间。我在应用程序中也没有名为 System
的模块(即没有定义 Myapp.System
或类似模块)。
查找 iex.exs 文件。如果有这样的文件,当 iex 为 运行 时,它会自动为 运行。如果您在 iex.exs 中引用命名空间,则可以解释此行为。
您可以在文档中找到更多信息https://hexdocs.pm/iex/IEx.html#module-the-iex-exs-file
从我的 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
之类的模块会产生此错误,而 Enum
、List
或 Map
之类的模块则不会?
此外,如果我在我的应用程序源之外使用 iex
,我可以按预期调用 System.any_function
。
经过进一步检查,我可以通过调用 Elixir.System.stop/1
使其正常工作。为什么我需要在 System
模块前面加上 Elixir.
但我不需要为其他 Elixir 模块这样做?
在我的应用程序代码中,我调用 System.backtrace
或 System.get_env
之类的东西,不需要别名或命名空间。我在应用程序中也没有名为 System
的模块(即没有定义 Myapp.System
或类似模块)。
查找 iex.exs 文件。如果有这样的文件,当 iex 为 运行 时,它会自动为 运行。如果您在 iex.exs 中引用命名空间,则可以解释此行为。
您可以在文档中找到更多信息https://hexdocs.pm/iex/IEx.html#module-the-iex-exs-file