2016-04-08 5 views
31

I "m derzeit Elixir Lernen durch die OTP und Tutorial auf der Elixier-lang Website gehe durch mischten, und ich habe Probleme, herauszufinden, wie das Projekt von in der Schale neu kompilieren und laden.Wie kann ich ein Elixir-Projekt neu kompilieren und von iex laden?

In Erlang I täte make:all([load]) und es wäre eine Belastung alle Änderungen kompilieren, die. aber in iex aufgetreten, die :up_to_date immer sagt, was Sinn macht, als Elixier Mischung verwendet für seine Bedürfnisse zu kompilieren.

ich keine Äquivalent von innen finden iex

+0

Haben Sie 'r/1' in' iex' versucht? Beachten Sie, dass Sie eine Hilfe in 'iex' aufrufen können, indem Sie' h() 'aufrufen. Sehen Sie sich um, wenn einige davon Ihnen helfen können. – Guedes

+0

Ich hatte nichts von 'r/1 'gewusst, aber das ist immer noch nicht gleichwertig. Ich muss jedes Modul manuell eingeben, für das ich den Code aktualisiert habe, wobei 'make: all ([load])' automatisch aktualisierte Module erkennen und neu kompilieren/neu laden würde. – KallDrexx

+0

Vielleicht suchen Sie etwas im Zusammenhang mit http://stackoverflow.com/questions/32540703/make-elixir-app-recompile-and-reload-on-source-code-change und https://groups.google.com /forum/ #! topic/elixir-lang-talk/uU8K2NJAE70? Es scheint, dass dies mit denen dupliziert wird. – Guedes

Antwort

54

Sie können die IEx.Helpers.recompile/0 Funktion verwenden.

Kompiliert die aktuelle Mix-Anwendung neu.

Dieser Helper funktioniert nur, wenn IEx mit einem Mix-Projekt gestartet wird, z. B. , iex -S mix. Vor dem Kompilieren des Codes wird die aktuelle Anwendung angehalten und danach erneut gestartet. Stoppen Anwendungen sind erforderlich, damit Prozesse in der Überwachungsstruktur nicht abstürzen, wenn Code mehrfach aktualisiert wird, ohne durch die richtigen Hot-Code-Swapping-Mechanismus gehen.

Änderungen an mix.exs oder Konfigurationsdateien werden von diesem Helfer nicht übernommen, nur Änderungen an Quellen. Neustart der Shell und Mix ist in solchen Fällen erforderlich. Wenn Sie ein einzelnes Modul neu laden möchten, sollten Sie stattdessen r ModuleName verwenden.

HINWEIS: Diese Funktion ist experimentell und kann in den folgenden Releases entfernt werden.

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

+2

Würde 'c (" filename.ex ")' auf die gleiche Weise funktionieren @Dogbert? Nur neugierig. –

+0

@OnorioCatenacci nein, es kompiliert nur eine Datei, Punkt. – develop7

+0

IEx.Helpers.recompile/0 wird laufende Prozesse abstürzen. Es ignoriert auch Kompilierungsfehler, indem es die fehlerhaften Module nicht lädt. Dies macht es für Live-Codierung unbrauchbar. –

6

Der einzige Nachteil an @ Dogbert Antwort fand ich ist es macht einen vollständigen Stopp und Neustart der Anwendung. Während dies in der Theorie in Ordnung ist, scheiterte es in meinem aktuellen Projekt, da mein Projekt von Ranch abhängig ist, aber alles wurde nicht richtig gestoppt. Dies bedeutete, dass beim Versuch, das Projekt neu zu starten, ein Fehler aufgetreten war, weil der Socket bereits verwendet wurde.

Lange Rede kurzer Sinn, sah ich den Code der Helfer und hinzugefügt, um die folgende Funktion zu meinem Modul:

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 

Jetzt kann ich eingeben MyApp.recompile und alles ist hot-nachgeladen ohne Neustart der Anwendung.

+0

Dies funktioniert nicht mehr in Version 1.5. Ich bekomme '[: noop,: noop]' –

15

26. Februar 2017:

heiße Lastkomponenten in einem laufenden Elixier System mit der geringstenen Chance, etwas falsch zu verwenden gehen:

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

Ursprüngliche Antwort:

In Elixier 1.3. 0 rekompilieren startet die Anwendung nicht mehr neu.Also der richtige Weg, um zu überprüfen, ob irgendeine Quelle geändert und hotload ist:

iex> recompile() 

HINWEIS: ich, dass hinzufügen möchten aufgrund von Problemen mit den Modulen während des recompile entfernt werden Sie höchstwahrscheinlich Crash Prozesse, während die erneute Kompilierung, wenn Sie auftreten Habe im Flug Nachrichten wie ein gen_statem mit einem state_timeout.

HINWEIS2: Mit recompile/0, wenn Sie einen Fehler in einer Quelldatei machen, wird das Projekt mit dieser fehlenden und entladenen Quelldatei kompilieren.

Verwandte Themen