2017-01-21 4 views
1

Я изучаю Yaws, и я прочитал руководство Yaws и Building Web Applications с книгой Erlang. Я следил за каждым шагом в последней главе книги, где создано приложение multi_cast, но я не могу его запустить. Я считаю, что это код Erlang, который не найден или не используется.Запуск кода и проектов Erlang в Yaws (ebin_dir)

У меня реж проекта в моем домашнем каталоге, и я указал фрамбезию docroot для данного виртуального сервера в мой каталог проекта, где htdocs режа с .yaws файлами проживает.

<server localhost>                              
    port = 8001 
    listen = 127.0.0.1 
    docroot = <my_path_here>/erlang_yaws/multi_cast 
</server> 

и я изменил ebin_dir также указать на project's ebin каталог:

ebin_dir = <my_path_here>/erlang_yaws/multi_cast/_build/default/lib/multi_cast/ebin 

При запуске фрамбезии с yaws -i я могу пойти на некоторые простые .yaws файлы, которые я получил, который не полагайтесь ни на один из файлов проекта .beam. Однако, когда я изменить местоположение моего браузера до .yaws файлов, которые полагаются на скомпилированные файлы в приложение, я получаю следующее сообщение об ошибке:

=ERROR REPORT==== 21-Jan-2017::14:27:17 === 


ERROR erlang code threw an uncaught exception: 
File: <my_path_here>/erlang_yaws/multi_cast/htdocs/status.yaws:1 
Class: exit 
Exception: {noproc,{gen_server,call,[multi_cast_front,{get_etag}]}} 
Req: {http_request,'GET',{abs_path,"/htdocs/status.yaws"},{1,1}} 
Stack: [{gen_server,call,2,[{file,"gen_server.erl"},{line,204}]}, 
     {m_27449121_1,out,1, 
         [{file,"<my_path_here>/.yaws/yaws/default/m_27449121_1.erl"}, 
         {line,35}]}, 
     {yaws_server,deliver_dyn_part,8, 
        [{file,"yaws_server.erl"},{line,2872}]}, 
     {yaws_server,aloop,4,[{file,"yaws_server.erl"},{line,1242}]}, 
     {yaws_server,acceptor0,2,[{file,"yaws_server.erl"},{line,1065}]}, 
     {proc_lib,init_p_do_apply,3,[{file,"proc_lib.erl"},{line,247}]}] 

Я считаю, что это связано с тем, что мой gen_server приложение не запускается правильно или не нашли? Исходный код, похоже, успешно компилируется.

Я нахожусь на MacOS Sierra с Yaws 2.0.4, Erlang 19, и я сделал обычную установку Yaws с homebrew.

Кроме того, есть ли ресурс, который подробно объясняет, как структурировать Yaws и простое приложение? Читая как руководство, так и книгу, и оба не могут объяснить это (или я действительно толстый), и довольно сложно застревать с точки зрения пользователя.

ответ

1

Вы правильно добавили свои модули в путь загрузки, используя конфигурационную переменную ebin_dir, но этого недостаточно для запуска и запуска приложения. В приведенной ниже книге не говорится об этом — см. Стр. 101, где сказано: «Также можно запускать Yaws как приложение OTP в существующей настройке Erlang, но это выходит за рамки этой книги».

простой способ запустить сервер, чтобы использовать переменную runmod конфигурации, документированный в the yaws_config man page:

runmod = ModuleName
    At startup Yaws will invoke ModuleName:start() in a separate process. It is possible
    to have several runmods. This is useful if we want to reuse the Yaws startup shell
    script for our own application.

Предполагая, что ваш gen_server обеспечивает start/0 функцию, установите имя модуля в качестве значения runmod и Yaws начнут его. Проблема с этим подходом заключается в том, что он отлично работает для экспериментов, но не для производства, потому что нет ничего, что контролирует ваш gen_server.

Лучше всего иметь полное приложение OTP, работающее рядом с Yaws. При таком подходе руководители вашего приложения управляют вашими работниками. Один из способов сделать это - использовать yapps (Yaws applications). Другой способ - create a release, содержащий как Yaws, так и ваше приложение. Еще один способ - let Yaws supervise your workers.

Для решения второй части вашего вопроса требуется определение того, что вы подразумеваете под «простым приложением». Это простое статическое приложение? Простое приложение с использованием .yaws страниц? Простое приложение SSE?Простое приложение appmod? Простое приложение для веб-приложений? Простое приложение, работающее как брат Yaws? Существует множество возможных определений. Лучший короткий ответ - всегда структурировать ваше приложение, используя OTP design principles. Вы также можете рассмотреть вопрос по отправке вопросов по этой теме на Yaws mailing list.