Elixirアプリケーションを実行する正しい方法は何ですか?
私は簡単なプロジェクトを作成しています:
mix new app
その後、私は次のことができます:
mix run
基本的に私のアプリを一度コンパイルします。だから私が追加するとき:
IO.puts "running"
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
の依存関係に必要です。
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
この場合、コールバックで1秒間だけスリープし、その後何かを出力する単純なプロセスを開始します。これはstart
コールバックのAPIを満たすには十分ですが、"done sleeping"
は表示されません。その理由は、コールバックの実行が完了すると、デフォルトでmix run
が終了するためです。それが起こらないようにするには、mix run --no-halt
を使用する必要があります-この場合、VMは停止しません。
アプリケーションを起動するもう1つの便利な方法はiex -S mix
です。これはmix run --no-halt
と同様に動作しますが、コードと実行中のアプリケーションと対話できるiex
シェルも開きます。