2016-04-19 1 views
1

Я провел несколько часов, пытаясь устранить эту проблему, используя документацию по рысканиям и поиск в Интернете. Существующие темы здесь мне не помогли.Как запустить рыскание во встроенный режим?

Я новичок в erlang, и я пытаюсь запустить рыскания во встроенном режиме, используя пример кода, приведенный на http://yaws.hyber.org/embed.yaws. Мне что-то не хватает, потому что я не могу заставить его работать. У меня есть четыре файла:

ybed.app

{application, ybed_app, 
[ 
    {description, "Yaws Embedded Application Test"}, 
    {vsn, "0.1.0"}, 
    {registered, []}, 
    {applications, [kernel, stdlib, yaws]}, 
    {mod, {ybed_app, []}}, 
    {env, []} 
]}. 

ybed_app.erl

-module(ybed_app). 
-behaviour(application). 

%% Application callbacks 
-export([start/2, 
     stop/1]). 

start(_StartType, _StartArgs) -> 
    case ybed_sup:start_link() of 
     {ok, Pid} -> 
      {ok, Pid}; 
     Other -> 
      {error, Other} 
    end. 

stop(_State) -> 
    ok. 

ybed_sup.erl

-module(ybed_sup). 
-behaviour(supervisor). 

%% API 
-export([start_link/0]). 

%% Supervisor callbacks 
-export([init/1]). 

start_link() -> 
    supervisor:start_link({local, ?MODULE}, ?MODULE, []). 

init([]) -> 
    YBed = {ybed, {ybed,start,[]}, 
      permanent,2000,worker,[ybed]}, 
    {ok,{{one_for_all,0,1}, [YBed]}}. 

ybed.erl

-module(ybed). 
-compile(export_all). 

start() -> 
    {ok, spawn(?MODULE, run, [])}. 

run() -> 
    Id = "embedded", 
    GconfList = [{id, Id}], 
    Docroot = "/tmp", 
    SconfList = [{port, 8000}, 
       {servername, "foobar"}, 
       {listen, {127,0,0,1}}, 
       {docroot, Docroot}], 
    {ok, SCList, GC, ChildSpecs} = 
     yaws_api:embedded_start_conf(Docroot, SconfList, GconfList, Id), 
    [supervisor:start_child(ybed_sup, Ch) || Ch <- ChildSpecs], 
    yaws_api:setconf(GC, SCList), 
    {ok, self()}. 

Когда я скомпилировать его (успешно) и попробуйте запустить приложение, я получаю возвращаемое значение:

{error,{not_loaded,yaws}} 

Когда я пытаюсь запустить скомпилированный ybed.erl, ybed: бег(), я получаю:

** exception error: undefined function yaws_api:embedded_start_conf/4 
    in function ybed:run/0 (src/ybed.erl, line 16) 

Если я начинаю рытью перед тем, как запускать приложение, оно все равно не работает.

Я еще не пытаюсь создавать релизы, просто компилируйте и проверяйте рыскания во встроенном режиме. Может ли кто-нибудь сказать мне, что мне не хватает?

Заранее спасибо

ответ

0

Когда вы получите ошибку

** exception error: undefined function yaws_api:embedded_start_conf/4 
    in function ybed:run/0 (src/ybed.erl, line 16) 

Вы явно не yaws_api.beam в вашем code server пути поиска. Начните свой erl с надлежащего аргумента -pa или позвоните code:add_patha/1 в инициализацию вашего приложения, если вы не планируете использовать встроенный режим.

Кстати, существует четкий способ запуска yaws под вашим собственным руководителем, описанный в документации yaws, но без полного кода, поэтому здесь мы идем в одном модуле и с аккуратным ресурсом отладки и подготовкой к обслуживанию REST.

-module(ybed_yaws). 

-behaviour(supervisor). 

-include_lib("yaws/include/yaws_api.hrl"). 

%% API 
-export([start_link/0]). 

%% Supervisor callbacks 
-export([init/1]). 

%% Internal functions export 
-export([init_yaws/1, out/1]). 

%%%=================================================================== 
%%% Defaults 
%%%=================================================================== 

default_global() -> 
    #{id => "yaws", logdir => "log"}. 

default_server() -> 
    #{port => 9900, 
     listen => {0,0,0,0}, 
     docroot => "www", 
     appmods => [{"/", ?MODULE}]}. 

%%%=================================================================== 
%%% API functions 
%%%=================================================================== 

start_link() -> 
    supervisor:start_link(?MODULE, []). 

%%%=================================================================== 
%%% Supervisor callbacks 
%%%=================================================================== 

init([]) -> 
    {ok, 
    {{one_for_all, 0, 1}, 
     [#{id => init_yaws, 
     start => {?MODULE, init_yaws, [self()]}, 
     restart => transient}] 
    }}. 

%%%=================================================================== 
%%% Internal functions 
%%%=================================================================== 

init_yaws(Sup) -> 
    {ok, proc_lib:spawn_link(fun() -> config(Sup) end)}. 

ensure_dir(Dir) -> 
    {ok, App} = application:get_application(), 
    D = filename:join([code:priv_dir(App), Dir]) 
    filelib:ensure_dir(filename:join([D, "foo"])), 
    D. 

config(Supervisor) -> 
    #{id := Id} = GCMap = default_global(), 
    #{docroot := DR} = SCMap = default_server(), 
    Docroot = ensure_dir(DR), 
    {ok, SC, GC, ChildSpecs} = 
     yaws_api:embedded_start_conf(
      Docroot, 
      maps:to_list(SCMap#{docroot => Docroot}), 
      maps:to_list(GCMap), 
      Id), 
    [supervisor:start_child(Supervisor, Ch) || Ch <- ChildSpecs], 
    yaws_api:setconf(GC, SC), 
    ok. 

-compile({inline, [h/1, f/2]}). 
h(A) when is_atom(A) -> h(atom_to_binary(A, latin1)); 
h(S) -> yaws_api:htmlize(S). 

f(Fmt, Args) -> yaws_api:f(Fmt, Args). 

box(Str) -> 
    {'div',[{class,"box"}], 
    {pre, [], h(Str)}}. 

out(A) -> 
    PathString = case A#arg.pathinfo of 
       undefined -> ""; 
       P -> P 
      end, 
    Path = string:tokens(PathString, "/"), 
    Method = A#arg.req#http_request.method, 
    out(A, Method, Path). 

out(A, Method, Path) -> 
    {ehtml, 
    {html, [], 
     [{head}, 
     {body, [], 
     [ 
     {h5, [], "Paths:"}, 
     {hr}, 
     box(f("Method = ~p~n" 
       "Path = ~p~n" 
       "A#arg.querydata = ~p~n", 
       [Method, 
       Path, 
       A#arg.querydata])), 
     {h5, [], "Headers:"}, 
     {hr}, 
     {ol, [], yaws_api:reformat_header(
        A#arg.headers, 
        fun(H, V)-> 
          {li, [], [h(H), ": ", {code, [], h(V)}]} 
        end 
        )} 
     ]} 
     ]} 
    }. 

Обратите внимание на способе, как yaws инициализирован в OTP совместимого переходном процессе, но без gen_server.

Добавить {yaws, [{embedded, true}]} в ваш файл .config, чтобы сохранить общие службы общего доступа от запуска. Он будет работать даже без него, но он не будет полностью встроен.

+0

Спасибо! Это мелочи для таких нубов, как я, включая включение всех пучков лучей в конфигурацию виртуальной машины или приложения. Это решило мою проблему. – Will

Смежные вопросы