web-dev-qa-db-ja.com

Elixirアプリケーションを実行する方法は?

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の依存関係に必要です。

74
Kamil Lelonek

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シェルも開きます。

91
Paweł Obrok

Mix.Taskの代わりにmix runをモジュールにインポートすることにより、タスクを実行できます。

this があなたが探しているものだと思います。

その上で、mix <task.run>の代わりに、mixを実行するだけで、デフォルトのタスクを実行できます。 default_task: "bot.run"def project do [..] endのリストにmix.exsを追加するだけです。 here を参照してください。

7
holyxiaoxin