2017-01-21 19 views
1

나는 Yaws를 탐구하고 있으며 Yaws 매뉴얼과 Erlang 책으로 웹 애플리케이션 구축하기를 읽었습니다. 나는 multi_cast 응용 프로그램이 빌드 된 책의 마지막 장에서 모든 단계를 밟았지만 실행할 수는 없습니다. 나는 그것이 발견되거나 사용되지 않는 Erlang 코드라고 믿는다.Yaws에서 Erlang 코드와 프로젝트 실행 (ebin_dir)

는 내 홈 디렉토리에 프로젝트 디렉토리를 가지고와 나는 .yaws 파일이있는 htdocs 디렉토리가있는 내 프로젝트 디렉토리에이 특정 가상 서버 딸기 종 docroot을 지적했습니다.

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

나는 또한 project's에 ebin 디렉토리를 가리 키도록 ebin_dir을 변경했습니다 : 내가있어 몇 가지 간단한 .yaws 파일에 갈 수 yaws -i와 딸기 종을 시작하면

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

을하는 프로젝트의 .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 응용 프로그램이 제대로 시작되지 않거나 때문이다 믿는다 찾지 못했습니까? 소스 코드가 성공적으로 컴파일 된 것 같습니다.

저는 Yaws 2.0.4, Erlang 19가있는 MacOS Sierra를 사용 중이며 homebrew으로 정규 Yaws를 설치했습니다.

또한 Yaws와 간단한 응용 프로그램을 구성하는 방법을 철저히 설명하는 리소스가 있습니까? 매뉴얼과 책 모두를 읽으면이 설명에 실패합니다 (또는 나는 정말로 두껍습니다). 그리고 사용자 경험의 관점에서 볼 때 상당히 실망합니다.

답변

1

ebin_dir 구성 변수를 사용하여 모듈을로드 경로에 올바르게 추가했지만 실제로 응용 프로그램을 시작하고 실행하기에 충분하지 않습니다. 당신이 따라하는 책은 —을 언급하지 않습니다. 10138 페이지를보십시오. "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 응용 프로그램을 만드는 것입니다. 이 방법을 사용하면 응용 프로그램의 감독자가 작업자를 관리 할 수 ​​있습니다. 이를 수행하는 한 가지 방법은 yapps (Yaws applications)을 사용하는 것입니다. 또 다른 방법은 Yaw와 응용 프로그램이 모두 포함 된 create a release입니다. 또 다른 방법은 let Yaws supervise your workers입니다.

질문의 두 번째 부분을 다루는 것은 "간단한 응용 프로그램"이 의미하는 것을 정의해야합니다. 간단한 정적 페이지 응용 프로그램입니까? .yaws 페이지를 사용하는 간단한 응용 프로그램? 간단한 SSE 응용 프로그램?간단한 appmod 응용 프로그램? 간단한 websocket 응용 프로그램? Yaws의 형제로 실행되는 간단한 응용 프로그램? 다양한 정의가 가능합니다. 가장 좋은 대답은 항상 OTP design principles을 사용하여 애플리케이션을 구성하는 것입니다. 이 주제에 대한 질문은 Yaws mailing list으로 보내주십시오.