Как правильно использовать синхронизацию с приложением, созданным с помощью релизного ассемблера relx?
Я хотел бы использовать синхронную перекомпиляцию Sync с проектом Cowboy, собранным с использованием relx (согласно Руководству по началу работы с Cowboy).
Проблема в том, что даже если мне удастся запустить синхронизацию в моем приложении, упомянув синхронизацию в списке приложений в файле my_application.app.src, например так:
{application, my_application, [
{description, "My Cowboy Application"},
{vsn, "0.1.0"},
{modules, []},
{registered, [my_app_sup]},
{applications, [
kernel,
stdlib,
cowboy,
sync
]},
{mod, {my_app, []}},
{env, []}
]}.`
Я до сих пор не могу заставить его работать, потому что ассемблер relx не перемещает мой исходный код в каталог _rel (конечно, это не должно).
Есть ли способ сообщить Sync, где находятся мои исходные файлы? Или, может быть, я совершенно не прав, и интеграция Sync с relx должна выполняться другим способом?
2 ответа
Моя настройка разработки с синхронизацией состоит из:
- Установка синхронизации с моим экспортированным путем ERL_LIBS (т.е.
$HOME/lib/erlang
) - Создание конфигурации relx для разработки и выполнение ее с
relx -c relx-dev.config
- Создание простого сценария оболочки, чтобы перейти в место, где находится консольный сценарий, и выполнить его
- Добавление скрипта конфигурации для настройки моих рычаний
При разработке я включаю синхронизацию в свой файл relx.config для разработки. Однако, как только я устанавливаю синхронизацию в каталог и экспортирую его в ERL_LIBS, он волшебным образом появляется, когда я запускаю приложение синхронизации в любом из моих проектов erlang.
Вот пример моего файла relx-dev.config для разработки:
{dev_mode, true}.
{lib_dirs, ["/usr/local/erlang"]}.
{output_dir, "_rel-dev"}.
{release,
{myapp, "0.0.1"},
[{myapp_core, "0.0.1", '='}, sasl, syntax_tools, compiler, sync]
}.
{extended_start_script, true}.
Как только сценарий relx-dev.config создан, я создаю релиз с помощью этой команды:
relx -c relx-dev.config
Здесь console
скрипт, который я использую для запуска консоли:
#!/usr/bin/sh
_rel-dev/myapp/bin/myapp console
Этот скрипт запустит оболочку erlang с именем узла, запустит все мои приложения и приложение синхронизации и загрузит пользовательский файл конфигурации синхронизации.
Вот пример sync.config
файл находится в том же каталоге, где вы запустили оболочку:
[{sync, [{growl, [errors, warnings]}]}].
Синхронизация README содержит много информации о настройке поведения ведения журнала для консоли и рычания. Альтернативы использованию .config
файл включает параметры передачи в erl
командование и выполнение функций синхронизации в оболочке.
Если я правильно понимаю ваш вопрос, вам нужно просто запустить приложение через relx, и Scan выполнит поиск изменений, внесенных вами в источник. Если так, то вот что вы делаете.
Когда вы запускаете команду relx, добавьте опцию -d.
./relx -d правда
Это означает, что relx будет ссылаться на все ваши зависимости вместо того, чтобы копировать их. Это также ускоряет процесс упаковки. Оттуда просто запустите ваше приложение в папке _rel (или там, где вы когда-либо его выводите) и выполните "синхронизацию".
Пара заметок:
1) Если вы не хотите использовать символическую ссылку на ВСЕ зависимости, вы можете использовать функцию переопределения. Однако я ленивый и делаю все или ничего не подход:)
2) В вашем файле relx.config убедитесь, что вы включили "компилятор" и syntax_tools в качестве зависимостей, или сканирование будет зависать при каждом редактировании файла:(
Вот копия моего relx.config, если это помогает
{paths, ["apps", "deps"]}.
{lib_dirs, ["/usr/local/lib/erlang/lib", "apps", "deps"]}.
{sys_config, "./config/sys.config"}.
{release, {merigo_chat, "1.0.0"}, [
kernel,
stdlib,
syntax_tools,
compiler,
sync,
{mySampleApp, "1.0.0"},
% Debugging applications, Need to run observer and debugger from within the package
tools,
wx,
observer,
runtime_tools,
webtool,
appmon,
debugger
]}.
% Not you can skip the overrides if you use the -d option in relx
{overrides, [
{mySampleApp, "apps/mySampleApp"},
]}.
{extended_start_script, true}.