Как перезагрузить весь код 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).
,
Есть ли более простой способ забрать мои изменения?
1 ответ
Вызов приложения:load(App) (после остановки и выгрузки) перезагрузит файл.app, но не модули. Как сказано в документации: "Обратите внимание, что функция не загружает фактический объектный код Erlang".
Если бы вам нужно было выполнить обновление с использованием выпусков, вы бы отправили файл.appup, в котором указывалось, какие модули необходимо перезагрузить при обновлении до новой версии (нет необходимости перезагружать их все, если только один или два изменились), но если вы ' Вы только разрабатываете и не хотите останавливать и перезапускать все, вам придется настроить свои собственные функции помощи для перезагрузки кода.
Например, если вы уверены, что в.app-файле всегда перечислены все модули приложения, вы можете прочитать эту запись (после перезагрузки), используя application:get_key(App, modules), и просто перебрать список модулей, вызывающих c:l(Module) на каждом из них. Просто помните, что перезагрузка всех модулей все время является жесткой для процессов, которые могут держаться на веселье в течение двух перезагрузок.