2017-01-21 9 views
1

私はYawsを調べています。私はYawsのマニュアルとErlangの本を使ってWebアプリケーションを構築しています。私はmulti_castアプリが構築されている本の最後の章のすべてのステップに従ってきましたが、実行できません。私はそれが見つけられたり使用されていないErlangコードだと信じています。YawsでErlangコードとプロジェクトを実行する(ebin_dir)

私は私のホームディレクトリにプロジェクトのディレクトリを持っていると私は.yawsファイルとhtdocs dirが存在する私のプロジェクトディレクトリに、この特定の仮想サーバー用のイチゴ腫docrootを指摘しました。

<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を使用してモジュールをロードパスに正しく追加しましたが、アプリケーションを実際に起動して実行するには不十分です。あなたが従っている本はこの—には触れていません。ここにはと書かれています。「Yawsを既存のErlang設定の中でOTPアプリとして実行することもできますが、これはこの本の範囲を超えています。

サーバーを起動する簡単な方法は、the yaws_config man pageに記載runmod設定変数を使用することです:

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_serverstart/0機能を提供し、runmodの値として、あなたのモジュールの名前を設定すると仮定すると、 Yawsが起動します。しかし、このアプローチの問題は、あなたのgen_serverを監督するものがないので、実験ではうまく動作しますが、生産では問題ないということです。

より良い方法は、Yawsの横にフルOTPアプリケーションを実行することです。この方法では、アプリケーションのスーパーバイザがワーカーを管理します。これを行う1つの方法は、yapps (Yaws applications)を使用することです。もう1つの方法は、Yawとアプリケーションの両方を含むcreate a releaseです。さらに別の方法はlet Yaws supervise your workersです。

質問の第2の部分に対処するには、「単純なアプリケーション」の意味を定義する必要があります。それは単純な静的ページアプリケーションですか? .yawsページを使用して簡単なアプリケーションですか?シンプルなSSEアプリケーションですか?単純なappmodアプリケーションですか?シンプルなwebsocketアプリケーションですか? Yawsの兄弟として実行される単純なアプリケーションですか?さまざまな定義があります。最善の答えは、常にOTP design principlesを使用してアプリケーションを構成することです。また、このトピックに関する質問をYaws mailing listに送信することを検討することもできます。

関連する問題