Как запустить приложение эликсир?
Как правильно запустить приложение эликсир?
я создаю простой проект:
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.
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 endThe
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