Как перезагрузить весь код OTP при разработке приложения OTP?

Пока я изучаю OTP, я вносил много изменений в файлы .app и .erl и повторно запускал свое приложение, чтобы увидеть эффект от изменений.

Я пробовал следующую последовательность команд, чтобы уловить все мои новые изменения, но, похоже, это не работает:

Скомпилировать файлы src ...

erlc -o ebin src/*.erl

... за которым следует оболочка erlang:

application:stop(my_app).
application:unload(my_app).
application:load(my_app).
application:start(my_app).

Однако, похоже, это не работает. Единственный способ, который я нашел, - это выйти из оболочки erlang, перекомпилировать приложение и затем запустить application:start(my_app)..

Есть ли более простой способ получить мои изменения?


person Chris Snow    schedule 14.03.2015    source источник
comment
Взгляните на mochiweb reloader. После запуска процесс обнаруживает перекомпилированные файлы и автоматически перезагружает их. Рекомендуется только на стадии разработки.   -  person Łukasz Ptaszyński    schedule 14.03.2015
comment
Обычно я изменяю только один или два модуля за раз и перезагружаю их. Для этого достаточно просто сделать c(module). Если ваш код структурирован как приложение OTP, то запуск make:all() очень удобен (вам нужен файл Emakefile, но базовый - это 1 или 2 строки erlang.org/doc/man/make.html).   -  person zxq9    schedule 15.03.2015


Ответы (1)


Вызов приложения: load (App) (после остановки и выгрузки) перезагрузит файл .app, но не модули. Как говорится в документации: Обратите внимание, что функция не загружает фактический объектный код Erlang.

Если бы вы выполняли обновление с использованием выпусков, вы бы отправили файл .appup, в котором указано, какие модули следует перезагружать при обновлении до новой версии (нет необходимости перезагружать их все, если изменились только один или два), но если вы: вы просто разрабатываете и не хотите останавливать и перезапускать все, вам придется настроить свои собственные справочные функции для перезагрузки кода.

Изменить: Начиная с OTP 20 (2017), интерактивная оболочка Erlang теперь имеет функцию lm () для загрузки всех модулей, файлы .beam которых были изменены, поэтому для этого больше нет необходимости использовать собственную служебную функцию. См. https://erlang.org/doc/man/c.html#lm-0

person RichardC    schedule 14.03.2015
comment
На этапе обучения я предполагаю, что это довольно небольшое количество модулей кода, которые вы, возможно, просто изменяете один или два за раз с небольшими приращениями, когда чувствуете свой путь, просто компилируя и загружая измененные модули напрямую, используя c:l(Module) , как показывает @RichardC в своем ответе, вероятно, это все, что вам нужно сделать, чтобы внести свои изменения для тестирования, если вы не изменяете переменные среды или какой-либо другой параметр уровня приложения. - person snwight; 15.03.2015
comment
@snwight: да, пока я учусь, я работаю только с несколькими модулями. - person Chris Snow; 15.03.2015