Jaki jest prawidłowy sposób uruchamiania aplikacji Elixir?
Tworzę prosty projekt poprzez:
mix new app
a potem mogę:
mix run
który w zasadzie raz kompiluje moją aplikację. Więc kiedy dodam:
IO.puts "running"
w lib/app.ex
widzę "running"
tylko po raz pierwszy, każdy kolejny run
nic nie robi, chyba że istnieją pewne zmiany. Co mogę zrobić dalej z wygenerowanym app.app
?
Oczywiście wiem, że mogę:
escript: [main_module: App]
w mix.exs
, podaj, def main(args):
a następnie:
mix escript.build
./app
ale moim zdaniem jest to trochę kłopotliwe.
Jest też coś takiego:
elixir lib/app.exs
ale nie liczy się to mix.exs
oczywiście, co jest potrzebne do zależności w moim app
.
.exs
plik), ale zrób to w kontekście swojej aplikacji do miksowania, możesz uruchomićmix run <script>
. Zobacz,mix help run
aby uzyskać więcej informacji.Odpowiedzi:
mix run
uruchamia Twoją aplikację. Chodzi o to, że kiedy po prostu umieściszIO.puts "something"
w pliku, który wiersz jest oceniany tylko w czasie kompilacji, nic nie robi w czasie wykonywania. Jeśli chcesz, aby coś zaczęło się po uruchomieniu aplikacji, musisz to określić w plikumix.exs
.Zwykle chcesz
Application
zacząć od najwyższego poziomu . Aby to osiągnąć, dodajmod
opcję domix.exs
:def application do [ # this is the name of any module implementing the Application behaviour mod: {NewMix, []}, applications: [:logger] ] end
A następnie w tym module musisz zaimplementować wywołanie zwrotne, które będzie wywoływane przy starcie aplikacji:
defmodule NewMix do use Application def start(_type, _args) do IO.puts "starting" # some more stuff end end
start
Zwrotna powinna faktycznie konfiguracja procesu lub korzeń drzewa nadzór najwyższego poziomu, ale w tym przypadku będzie już widać, że jest ona wywoływana za każdym razem korzystaćmix run
, choć następuje błąd.def start(_type, _args) do IO.puts "starting" Task.start(fn -> :timer.sleep(1000); IO.puts("done sleeping") end) end
W tym przypadku rozpoczynamy prosty proces w naszym wywołaniu zwrotnym, który po prostu śpi na jedną sekundę, a następnie wyświetla coś - to wystarczy, aby spełnić API
start
wywołania zwrotnego, ale tego nie widzimy"done sleeping"
. Powodem tego jest to, że domyślniemix run
zakończy działanie po zakończeniu wykonywania tego wywołania zwrotnego. Aby tak się nie stało, musisz użyćmix run --no-halt
- w tym przypadku maszyna wirtualna nie zostanie zatrzymana.Innym użytecznym sposobem uruchamiania aplikacji jest
iex -S mix
- będzie to zachowywało się w podobny sposób,mix run --no-halt
ale także otwieraiex
powłokę, w której można wchodzić w interakcje z kodem i uruchomioną aplikacją.źródło
returned a bad value: :ok
błąd, gdy go nie maTask
,Agent
lubSupervisor
itp.? Jak to działa i dlaczego potrzebujemy oddzielnego procesu? Dlaczego nie mogę po prostu uruchomić skryptu, który wykonuje wszystko, czego potrzebuję?Supervisor.start_link [], strategy: :one_for_one
. Zwrócenie zadania, które zostanie zamknięte, może spowodować awarię aplikacji po uśpieniu.Supervisor
. UżyłemTask
tylko po to, żeby mieć najmniejszy poprawny program, ale jak wspomniał Jose - chcesz tam rozpocząć drzewo nadzoru.IO.puts "something"
plik w tym wierszu, który jest oceniany tylko w czasie kompilacji, nic nie robi w czasie wykonywania”. co wydaje się odpowiadać temu, co widzę, ale nie rozumiem logiki tego? Dlaczego to działa w ten sposób?Możesz uruchamiać zadania, importując je
Mix.Task
do swojego modułu zamiastmix run
.Myślę, że właśnie tego szukasz.
Ponadto zamiast tego
mix <task.run>
możesz po prostu uruchomićmix
zadanie domyślne. Po prostu dodajdefault_task: "bot.run"
do listydef project do [..] end
wmix.exs
. Zobacz tutaj .źródło