update repl descargar elixir mix

repl - ¿Cómo recompilo un proyecto Elixir y lo vuelvo a cargar desde iex?



elixir repl (3)

Actualmente estoy aprendiendo Elixir yendo a través de la OTP y mezclando el tutorial en el sitio web de elixir-lang, y tengo problemas para encontrar cómo volver a compilar y volver a cargar el proyecto desde dentro del caparazón.

En Erlang haría make:all([load]) y compilaría y cargaría cualquier cambio que ocurriera. Sin embargo, en iex eso siempre dice :up_to_date , que tiene sentido, ya que Elixir usa mix para sus necesidades de compilación.

No puedo encontrar ningún equivalente desde dentro de iex.


26 de febrero de 2017:

Para cargar en caliente componentes en un sistema elixir en ejecución con la menor posibilidad de que algo salga mal, use:

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

Respuesta original:

En elixir 1.3.0 recompile ya no reinicia la aplicación. Entonces, la forma correcta de verificar si alguna fuente cambió y la carga es:

iex> recompile()

NOTA: Deseo agregar que debido a problemas con la eliminación de módulos durante la recompilación, es muy probable que bloquee los procesos mientras se produce la recompilación si tiene mensajes en vuelo como gen_statem con state_timeout.

NOTA 2: Al usar recompile / 0 si comete un error en un archivo fuente, el proyecto compilará con ese archivo fuente que falta y está descargado.


La única desventaja de la respuesta de @ Dogbert que encontré es que hace una parada completa y se reinicia la aplicación. Si bien esto está bien, en teoría falló en mi proyecto actual, ya que mi proyecto dependía de Ranch, pero no todo se detuvo correctamente. Esto significaba que las cosas se rompieron cuando intentó reiniciar el proyecto porque no funcionaba porque el socket ya estaba en uso.

Para resumir, miré el código del ayudante y agregué la siguiente función a mi módulo:

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

Ahora puedo ingresar a MyApp.recompile y todo se MyApp.recompile caliente sin que la aplicación se reinicie.


Puede usar la función IEx.Helpers.recompile/0 .

Recompila la aplicación Mix actual.

Este ayudante solo funciona cuando IEx se inicia con un proyecto Mix, por ejemplo, iex -S mix . Antes de compilar el código, detendrá la aplicación actual y la reiniciará luego. Las aplicaciones de detención son necesarias para que los procesos en el árbol de supervisión no se bloqueen cuando el código se actualiza varias veces sin pasar por el mecanismo de intercambio de códigos de acceso correcto.

Este mix.exs cambios en mix.exs o archivos de configuración, solo cambia a las fuentes. En tales casos, se requiere reiniciar el shell y Mix.

Si desea volver a cargar un único módulo, considere usar r ModuleName en r ModuleName lugar.

NOTA: Esta característica es experimental y puede eliminarse en próximas versiones.

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