繁体   English   中英

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

[英]Running Erlang code and projects in Yaws (ebin_dir)

我正在探索Yaws,并且已经阅读了Yaws手册和《用Erlang构建Web应用程序》一书。 在本书的上一章中,我已经遵循了multi_cast应用程序的每个步骤,但是我无法运行它。 我相信没有找到或使用的是Erlang代码。

我的主目录中有一个项目目录,并且已将特定虚拟服务器的Yaws docroot指向我的项目目录,该目录中包含.yaws文件的htdocs目录。

<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安装。

此外,是否有资源彻底解释了如何构造Yaws和一个简单的应用程序? 既阅读手册又阅读本书,都无法解释这件事(或者我真的很厚),而且从用户体验的角度来看,陷入困境是非常令人沮丧的。

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

启动服务器的一种简单方法是使用yaws_config手册页中记录的runmod配置变量:

runmod =模块名称
在启动时,Yaws将在单独的进程中调用ModuleName:start()。 有可能的
有几个runmod。 如果我们要重用Yaws启动外壳,这很有用
我们自己的应用程序的脚本。

假设您的gen_server提供了start/0函数,请将模块的名称设置为runmod的值,然后Yaws将启动它。 但是,这种方法的问题在于,它可以很好地用于实验,但不适用于生产环境,因为没有什么可以监督gen_server

更好的方法是让完整的OTP应用程序与Yaws一起运行。 通过这种方法,应用程序的主管可以管理您的工作人员。 一种实现方法是使用yapps(Yaws应用程序) 另一种方法是创建一个包含Yaws和您的应用程序的发行版 还有一种方法是让Yaws监督您的工人

要解决问题的第二部分,需要定义“简单应用程序”的含义。 它是一个简单的静态页面应用程序吗? 使用.yaws页面的简单应用程序? 一个简单的SSE应用程序? 一个简单的appmod应用程序? 一个简单的websocket应用程序? 作为Yaws的兄弟姐妹运行的简单应用程序? 有多种可能的定义。 最好的简短答案是始终使用OTP设计原则来构建应用程序。 您也可以考虑将有关此主题的问题发送到Yaws邮件列表

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM