Подтвердить что ты не робот

Как запустить приложение Elixir?

Каков правильный способ запуска приложения Elixir?

Я создаю простой проект:

mix new app

и после этого я могу сделать:

mix run

который в основном компилирует мое приложение один раз. Поэтому, когда я добавляю:

IO.puts "running"

in lib/app.ex Я вижу "running" только в первый раз, каждый последовательный run ничего не делает, если не происходят некоторые изменения. Что я могу сделать сгенерированный app.app?

Конечно, я знаю, что могу:

escript: [main_module: App]

в mix.exs, укажите def main(args):, а затем:

mix escript.build
./app

но это, по моему мнению, громоздко.

Там также что-то вроде:

elixir lib/app.exs

но это не означает mix.exs, очевидно, что необходимо для зависимостей в моем app.

4b9b3361

Ответ 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, где вы сможете взаимодействовать с вашим кодом и запущенным приложением.

Ответ 2

Вы можете запускать задачи, импортируя Mix.Task в свой модуль вместо mix run.

Я думаю, этот - это то, что вы ищете.

Кроме того, вместо mix <task.run> вы можете просто запустить mix для запуска задачи по умолчанию. Просто добавьте default_task: "bot.run" в список def project do [..] end в mix.exs. Обратитесь здесь.