【问题标题】:Running Erlang code and projects in Yaws (ebin_dir)在 Yaws (ebin_dir) 中运行 Erlang 代码和项目
【发布时间】:2017-06-06 10:48:51
【问题描述】:

我正在探索 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 和一个简单的应用程序?阅读手册和书籍都无法解释这一点(或者我真的很厚),从用户体验的角度卡住是非常令人沮丧的。

【问题讨论】:

    标签: erlang yaws


    【解决方案1】:

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

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

    runmod = ModuleName
        在启动时,Yaws 将在单独的进程中调用 ModuleName:start()。有可能
        有多个 runmod。如果我们想为我们自己的应用程序重用 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 应用程序?作为 Yaws 的兄弟运行的简单应用程序?有多种可能的定义。最好的简短答案是始终使用OTP design principles 构建您的应用程序。您也可以考虑将有关此主题的问题发送至Yaws mailing list

    【讨论】:

      猜你喜欢
      • 2018-02-04
      • 2015-03-29
      • 2011-04-01
      • 2011-09-14
      • 2014-07-16
      • 2015-03-30
      • 2015-09-07
      • 2012-07-24
      • 2023-04-09
      相关资源
      最近更新 更多