Как остановить принудительное пространство имен модулей в консоли Elixir Phoenix iex?
При использовании iex
консоль из моего приложения Phoenix, следующим образом:
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
или подобный модуль определен).
1 ответ
Найдите файл iex.exs. Если такой файл существует, он автоматически запускается при запуске iex. Если вы ссылаетесь на пространства имен в iex.exs, это объясняет это поведение.
Вы можете узнать больше в документации https://hexdocs.pm/iex/IEx.html