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

时间:2017-01-21 14:50:52

标签: erlang yaws

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

我的主目录中有一个项目目录,我已将这个特定虚拟服务器的Yaws docroot指向我的项目目录,其中htdocs目录带有.yaws个文件驻留。

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

我已将ebin_dir更改为指向项目的ebin目录:

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

在使用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}]}]

我认为这是因为我的gen_server应用无法正常启动或未找到?源代码似乎成功编译。

我在MacOS Sierra上使用Yaws 2.0.4,Erlang 19和我使用homebrew进行常规Yaws安装。

此外,是否有资源彻底解释了如何构建雅司和简单的应用程序?阅读手册和书籍都没有解释这个(或者我真的很厚),而且从用户体验的角度来看是非常令人沮丧的。

1 个答案:

答案 0 :(得分:0)

您已使用ebin_dir配置变量将模块正确添加到加载路径,但这还不足以实际启动和运行您的应用程序。您所关注的书籍没有解决这个问题 - 请参阅第101页,其中显示“也可以在现有的Erlang设置中将Yaws作为OTP应用程序运行,但这超出了本书的范围。 。“

启动服务器的简便方法是使用the yaws_config man page中记录的runmod配置变量:

  

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

假设您的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应用程序?一个简单的websocket应用程序?一个简单的应用程序作为雅司病的兄弟?有各种可能的定义。最简短的答案是始终使用OTP design principles构建应用程序。您也可以考虑向Yaws mailing list发送有关此主题的问题。