Ответ 1
mix run
запускает ваше приложение. Просто, когда вы просто помещаете IO.puts "something"
в файл, эта строка оценивается только во время компиляции, она ничего не делает во время выполнения. Если вы хотите, чтобы что-то началось при запуске приложения, вам нужно указать его в mix.exs
.
Обычно вам нужен начальный уровень Application
, который будет запущен. Для этого добавьте опцию mod
к mix.exs
:
def application do
[
# this is the name of any module implementing the Application behaviour
mod: {NewMix, []},
applications: [:logger]]
end
И затем в этом модуле вам нужно реализовать обратный вызов, который будет вызываться при запуске приложения:
defmodule NewMix do
use Application
def start(_type, _args) do
IO.puts "starting"
# some more stuff
end
end
Обратный вызов start
должен фактически настроить ваш корневой каталог верхнего уровня или дерева управления, но в этом случае вы уже увидите, что он вызывается каждый раз, когда вы используете mix run
, хотя за ним следует ошибка.
def start(_type, _args) do
IO.puts "starting"
Task.start(fn -> :timer.sleep(1000); IO.puts("done sleeping") end)
end
В этом случае мы начинаем простой процесс в нашем обратном вызове, который просто спит в течение одной секунды, а затем выводит что-то - этого достаточно, чтобы удовлетворить API обратного вызова start
, но мы не видим "done sleeping"
. Причиной этого является то, что по умолчанию mix run
выйдет после завершения завершения обратного вызова. Чтобы этого не произошло, вам нужно использовать mix run --no-halt
- в этом случае VM не будет остановлена.
Другим полезным способом запуска вашего приложения является iex -S mix
- это будет вести себя аналогично mix run --no-halt
, но также открыть оболочку iex
, где вы сможете взаимодействовать с вашим кодом и запущенным приложением.