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



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



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



mix new app


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



mix run


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



IO.puts "running"


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



конечно, я знаю, что могу делать:



escript: [main_module: App]


на mix.exs, оказать def main(args): и затем:



mix escript.build
./app


но это довольно громоздко на мой взгляд.



есть также что-то вроде:



elixir lib/app.exs


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

397   2  

2 ответов:

mix run запускается ваше приложение. Это просто, когда вы просто ставите IO.puts "something" в файле эта строка вычисляется только во время компиляции, она ничего не делает во время выполнения. Если вы хотите что-то начать, когда вы запускаете приложение, вам нужно указать, что в mix.exs.

обычно вы хотите на высшем уровне Application это будет начато. Для достижения этого добавьте на 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

The 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 - в этом случае виртуальная машина не будет остановлена.

еще один полезный способ запуска приложения iex -S mix - это будет вести себя подобным образом mix run --no-halt, но и открыть iex оболочка, где вы можете взаимодействовать с вашим кодом и запущенным приложением.

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

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

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

Comments

    Ничего не найдено.