2016-04-08 12 views
31

私は「現在、OTPを通過するとエリキシル-LANGのウェブサイト上のチュートリアルを混ぜることにより、エリクサーを学んM、と私は再コンパイルし、シェル内からプロジェクトを再読み込みする方法を見つけ出す問題を抱えています。アーランIでElixirプロジェクトを再コンパイルしてiex内からリロードするにはどうすればよいですか?

make:all([load])をするだろうし、それは私が内から任意の等価を見つけることができませんエリクサーはそれがニーズをコンパイルしていますためのミックスを使用して、意味を成さない。

を常に:up_to_date言うiexでしかし。発生したすべての変更、負荷をコンパイルしますiex。

+0

'iex'で' r/1'を試しましたか? 'hex()'を呼び出すことで、 'iex'のヘルプを呼び出すことができます。そのうちのいくつかがあなたを助けることができるかどうかを見てください。 – Guedes

+0

私は 'r/1'について知らなかったが、まだそれは同等ではない。 'make:all([load])'が更新されたモジュールを自動検出し、それらを再コンパイル/リロードするところで、私は手動で各モジュールを入力しなければなりません。 – KallDrexx

+0

多分、あなたはhttp://stackoverflow.com/questions/32540703/make-elixir-app-recompile-and-reload-on-source-code-changeとhttps://groups.google.comに関連するものを探しています。/forum /#!トピック/ elixir-lang-talk/uU8K2NJAE70?これはこれらのものと重複しているようです。 – Guedes

答えて

54

IEx.Helpers.recompile/0機能を使用できます。

現在のMixアプリケーションを再コンパイルします。

このヘルパーは、の例では、iex -S mixのMixプロジェクトでIExを開始した場合にのみ機能します。コードをコンパイルする前に、現在のアプリケーション を停止し、その後に再起動します。 のアプリケーションを停止する必要がありますので、 ホットコードスワッピングの適切なメカニズムを経由せずにコードを複数回アップグレードすると、監督ツリーのプロセスで がクラッシュしません。

mix.exsへの変更またはこのコンフィグレーションファイルへの変更は、この ヘルパーによって選択されず、ソースのみが変更されます。このような場合は、シェルとミックスを再起動する必要があります。 です。

1つのモジュールをリロードする場合は、代わりにr ModuleName を使用することを検討してください。

注:この機能は実験的なもので、近日リリースの リリースでは削除される可能性があります。

https://github.com/elixir-lang/elixir/blob/v1.2.4/lib/iex/lib/iex/helpers.ex#L56-L93

+2

'c(" filename.ex ")' @Dogbertと同じように動作しますか?ちょっと興味があるんだけど。 –

+0

@OnorioCatenacciいいえ、ファイルの期間を再コンパイルするだけです。 – develop7

+0

IEx.Helpers.recompile/0は実行中のプロセスをクラッシュさせます。また、失敗したモジュールをロードしないことによってコンパイルエラーを無視します。これにより、ライブコーディングでは使用できなくなります。 –

6

1つの下方から@に私が見つけたDogbertの答えは、アプリケーションの完全な停止と再起動を行います。これは理論上は問題ありませんが、私のプロジェクトは牧場に依存しているため、現在のプロジェクトでは失敗しましたが、すべてが適切に停止されませんでした。これは、ソケットがすでに使用されていたために失敗したプロジェクトを再開しようとしたときに問題が発生したことを意味していました。

かいつまんで、私はヘルパーのコードを見て、私のモジュールに次の関数を追加しました:

def recompile() do 
    Mix.Task.reenable("app.start") 
    Mix.Task.reenable("compile") 
    Mix.Task.reenable("compile.all") 
    compilers = Mix.compilers 
    Enum.each compilers, &Mix.Task.reenable("compile.#{&1}") 
    Mix.Task.run("compile.all") 
    end 

今私はMyApp.recompileを入力することができ、すべてがアプリケーションの再起動せずにホットリロードされます。間違った使用を行く何かの最低のチャンスとランニングエリキシルシステムでのホットロードコンポーネントに

+0

これはバージョン1.5では機能しなくなりました。私は '[:noop、:noop]'を得る –

15

2017年2月26日

case c(filename_ex, :in_memory) do 
    [] -> :ignore 
    [mod|_] -> r(mod) 
end 

オリジナルの答え:

エリクシル1.3で。 0再コンパイルはアプリケーションを再起動しません。

iex> recompile() 

注:私が原因あなたならば再コンパイルが発生している間、あなたは意志再コンパイル最も可能性の高いクラッシュプロセスの間にモジュールを取り外すと問題にそれを追加したい任意のソースを変更してhotloadがあるかどうかをチェックするので、正しい方法state_timeoutを持つgen_statemのような飛行メッセージがあります。

注2:ソースファイルにエラーが発生した場合、recompile/0を使用すると、そのソースファイルが抜けていて、アンロードされた状態でプロジェクトがコンパイルされます。

関連する問題