2017-01-21 77 views
1

我正在探索Yaws,並且我已閱讀Yaws手冊和使用Erlang書籍構建Web應用程序。我已經按照本書最後一章中的步驟構建了一個multi_cast應用程序,但我無法運行它。我相信這是沒有被發現或使用的Erlang代碼。在Yaws中運行Erlang代碼和項目(ebin_dir)

我有一個項目目錄在我的主目錄中,並且我已將Yaws docroot指定給我的項目目錄,其中htdocs目錄與.yaws文件駐留在此目錄中。

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

,我已經改變了ebin_dir也指向project's ebin目錄:

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

在與yaws -i開始雅司病我可以去一些簡單的.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和我做了一個正常的Yaws安裝與homebrew

另外,是否有一個資源,徹底解釋如何構建Yaws和一個簡單的應用程序?閱讀手冊和本書都無法解釋這個問題(或者我真的很厚),從用戶體驗的角度來看,這很讓人沮喪。

回答

1

您已經使用ebin_dir配置變量將您的模塊正確添加到了加載路徑,但這還不足以真正啓動和運行您的應用程序。您正在關注的書沒有解決—的問題,請參閱第101頁,它說「也可以在現有的Erlang安裝程序中將Yaws作爲OTP應用程序運行,但這超出了本書的範圍。

一種簡單的方法來啓動服務器是使用runmod配置變量,在the yaws_config man page記載:

runmod = ModuleName
    At startup Yaws will invoke ModuleName:start() in a separate process. It is possible
    to have several runmods. This is useful if we want to reuse the Yaws startup shell
    script for our own application.

假設你gen_server提供start/0功能,設定模塊的名稱作爲runmod值Yaws會啓動它。但是,這種方法存在的一個問題是,它對實驗很好,但不適合生產,因爲沒有任何東西在監督您的gen_server

更好的方法是讓一個完整的OTP應用程序與Yaws一起運行。通過這種方法,您的應用程序的主管人員可以管理您的員工一種方法是使用yapps (Yaws applications)。另一種方法是包含Yaws和您的應用程序的create a release。另一種方法是let Yaws supervise your workers

解決問題的第二部分需要定義「簡單應用程序」的含義。它是一個簡單的靜態頁面應用程序?一個簡單的應用程序使用.yaws頁面?一個簡單的SSE應用程序?一個簡單的appmod應用程序?一個簡單的websocket應用程序?一個簡單的應用程序作爲Yaws的兄弟運行?有各種可能的定義。最好的簡短答案是始終使用OTP design principles構建您的應用程序。您也可以考慮將此主題的問題發送到Yaws mailing list