在Yaws中运行Erlang代码和项目(ebin_dir)

在Yaws中运行Erlang代码和项目(ebin_dir),erlang,yaws,Erlang,Yaws,我正在探索Yaws,我已经阅读了Yaws手册和使用Erlang构建Web应用程序的书。在本书的最后一章中,我已经完成了构建多播应用程序的每一步,但我无法运行它。我相信是Erlang代码没有被发现或使用 我在我的主目录中有一个项目目录,我将这个特定虚拟服务器的Yawsdocroot指向我的项目目录,其中有一个htdocsdir和.Yaws文件 <server localhost>

我正在探索Yaws,我已经阅读了Yaws手册和使用Erlang构建Web应用程序的书。在本书的最后一章中,我已经完成了构建
多播应用程序的每一步,但我无法运行它。我相信是Erlang代码没有被发现或使用

我在我的主目录中有一个项目目录,我将这个特定虚拟服务器的Yaws
docroot
指向我的项目目录,其中有一个
htdocs
dir和
.Yaws
文件

<server localhost>                                                                                                                     
  port    = 8001
  listen  = 127.0.0.1
  docroot = <my_path_here>/erlang_yaws/multi_cast
</server>
使用
Yaws-i
启动Yaws后,我可以转到一些简单的
.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}]}]
=错误报告===2017年1月21日::14:27:17===
错误erlang代码引发了未捕获的异常:
文件:/erlang\u yaws/multi\u cast/htdocs/status.yaws:1
类别:出口
异常:{noproc,{gen_server,call,[multi_cast_front,{get_etag}]}
请求:{http_请求,'GET',{abs_路径,/htdocs/status.yaws},{1,1}
堆栈:[{gen_server,call,2,[{file,“gen_server.erl”},{line,204}]},
{m_2744912_1,out,1,
[{file,“/.yaws/yaws/default/m_2744912_1.erl”},
{line,35}]},
{yaws_服务器,交付第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_服务器
应用程序启动不正确或找不到?源代码似乎编译成功了

我在MacOS Sierra上使用Yaws 2.0.4和Erlang 19,我使用
homebrew
定期安装Yaws


另外,是否有一个资源可以彻底解释如何构造Yaws和一个简单的应用程序?阅读手册和本书,但都没有解释这一点(或者我真的很笨),从用户体验的角度来看,这是非常令人沮丧的。

您已经使用
ebin\u dir
配置变量正确地将模块添加到加载路径,但这还不足以实际启动和运行应用程序。您正在阅读的这本书没有提到这一点——请参阅第101页,其中写道,“在现有的Erlang设置中,也可以将Yaws作为OTP应用程序运行,但这超出了本书的范围。”

启动服务器的一种简单方法是使用
runmod
配置变量,记录在:

runmod=ModuleName
启动时,Yaws将在单独的进程中调用ModuleName:start()。有可能有多个runmod。如果我们想为自己的应用程序重用Yaws启动shell
脚本,这将非常有用

假设您的
gen_服务器提供了
start/0
功能,将模块名称设置为
runmod
的值,Yaws将启动它。不过,这种方法的一个问题是,它可以很好地用于实验,但不能用于生产,因为您的
gen_服务器

更好的方法是让完整的OTP应用程序与Yaws一起运行。通过这种方法,应用程序的主管可以管理工作人员。一种方法是使用。另一种方法是同时包含Yaws和应用程序。还有另一种方法是

解决问题的第二部分需要定义“简单应用程序”的含义。它是一个简单的静态页面应用程序吗?使用
.yaws
页面的简单应用程序?一个简单的SSE应用程序?一个简单的
appmod
应用程序?一个简单的websocket应用程序?作为Yaws的兄弟运行的简单应用程序?有多种可能的定义。最好的简短回答是始终使用。你也可以考虑向这个问题发送问题。p>
=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}]}]