我正在探索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安装。
此外,是否有资源彻底解释了如何构建雅司和简单的应用程序?阅读手册和书籍都没有解释这个(或者我真的很厚),而且从用户体验的角度来看是非常令人沮丧的。
答案 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发送有关此主题的问题。