Подтвердить что ты не робот

Как перекомпилировать проект Elixir и перезагрузить его из iex?

В настоящее время я изучаю Elixir, просматривая OTP и смешивая учебник на веб-сайте elixir-lang, и у меня возникают проблемы с поиском, как перекомпилировать и перезагрузить проект изнутри оболочки.

В Erlang я бы сделал make:all([load]), и он скомпилировал бы загрузку любых изменений, которые произошли. Однако в iex, который всегда говорит :up_to_date, что имеет смысл, поскольку Elixir использует mix для компиляции его потребностей.

Я не могу найти эквивалент изнутри iex.

4b9b3361

Ответ 1

Вы можете использовать функцию IEx.Helpers.recompile/0.

Перекомпилирует текущее приложение Mix.

Этот помощник работает только тогда, когда IEx запускается с проектом Mix, для пример, iex -S mix. Перед компиляцией кода он остановит текущее приложение, и снова запустите его. остановка требуются приложения, поэтому процессы в дереве наблюдения не будут сбой при обновлении кода несколько раз, не пройдя через правильный механизм обмена горячим кодом.

Изменения в mix.exs или файлы конфигурации не будут хелпер, только изменения в источниках. Перезапуск оболочки и Mix требуется в таких случаях.

Если вы хотите перезагрузить один модуль, рассмотрите возможность использования r ModuleNameвместо этого.

ПРИМЕЧАНИЕ. Эта функция является экспериментальной и может быть удалена в предстоящих релизов.

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

Ответ 2

26 февраля 2017 года:

Для компонентов горячей нагрузки в запущенной системе эликсиров с наименьшей вероятностью чего-то не так:

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

Оригинальный ответ:

В elixir 1.3.0 recompile больше не перезапускает приложение. Таким образом, правильный способ проверить, не изменился ли какой-либо источник, и получить горячую нагрузку:

iex> recompile()

ПРИМЕЧАНИЕ. Я хочу добавить, что из-за проблем с удалением модулей во время перекомпиляции вы, скорее всего, столкнетесь с процессами, когда происходит перекомпиляция, если у вас есть в сообщениях полета, таких как gen_statem с state_timeout.

ПРИМЕЧАНИЕ 2. Использование перекомпиляции /0, если вы делаете ошибку в исходном файле, проект будет скомпилирован с отсутствием и выгрузкой этого исходного файла.

Ответ 3

Единственный недостаток ответа @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, и все перезагружается без перезапуска приложения.