1. ホーム
  2. elixir

[解決済み] Elixirアプリケーションを実行するには?

2023-03-28 17:45:26

質問

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は停止されません。

アプリケーションを起動するためのもう一つの便利な方法は iex -S mix - と同じような動作をします。 mix run --no-halt と同じように動作しますが、さらに iex シェルを開き、そこで自分のコードや実行中のアプリケーションと対話することができます。