2015-03-14 2 views
1

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

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

Скомпилировать файлы в исходных текстах ...

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

Посмотрите на [mochiweb reloader] (https://github.com/oinksoft/reloader). После запуска процесс обнаруживает перекомпилированные файлы и автоматически перезагружает их. Рекомендуется только для стадии разработки. –

+1

Обычно я делаю изменения только для одного или двух модулей за раз и перезаряжаю. Для этого просто выполнение 'c (module)' достаточно хорошо. Если ваш код структурирован как приложение OTP, то выполнение 'make: all()' очень удобно (вам нужен Emakefile, но базовый - 1 или 2 строки http://www.erlang.org/doc/man/ make.html). – zxq9

ответ

2

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

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

E.g. если вы доверяете, что в файле .app всегда перечислены все модули приложения, вы можете прочитать эту запись (после перезагрузки) с помощью приложения: get_key (App, modules) и просто перебрать список модулей, вызывающих c: l (Module) на каждом из них. Просто помните, что перезагрузка всех модулей все время суровна в процессах, которые могут быть полезны для двух перезагрузок.

+1

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

+0

@snwight: да, я работаю только с несколькими модулями в данный момент, когда я учусь. –

Смежные вопросы