Webmachine嵌入式?

时间:2014-03-19 23:48:10

标签: erlang webmachine

有没有办法在“嵌入式​​”中运行(Erlang版本)Webmachine?我想将web应用程序嵌入到我正在编写的应用程序中。网络应用程序将只是一个前端与我正在写的后端进行通信。我想在一个虚拟机上运行一个代码库中的所有内容(webmachine,mochiweb,自定义Web应用程序,自定义后端)。

感谢。

1 个答案:

答案 0 :(得分:1)

Rebar提供了构建应用程序版本和管理其依赖项的便捷方法。由于主题非常复杂,我建议你看看非常好的网站learnyousomeerlang(我指出了关于版本的章节),以了解Rebar使用的基础方法。您还需要在OTP中充分了解应用程序的启动方式。

在您的情况下,后端是应用程序,所有其他应用程序都是依赖项。

[编辑] 我不会说你必须在Erlang中构建一个应用程序。由于没有链接,当VM需要时,所有模块都必须位于代码/库搜索路径中。甚至可以在运行时修改此路径。

OTP定义了组织不同文件的标准方法,VM定义了组织库的方法。螺纹钢的作用是帮助您为应用程序及其依赖的应用程序创建和维护此组织。它可以帮助您从存储库中检索所需的应用程序,并简化整个事物的构建。因此,它可以帮助您将应用程序分发给其他用户/计算机。

您可以查看webmachine代码本身,因为它使用rebar来构建iteself并获取它所依赖的应用程序(mochiweb,meck和ibrowse)。以下是Apache License 2.0版下https://github.com/basho/webmachine处可用的某个文件的副本。 rebar.config文件,它描述了依赖关系和"编译"选项:

%%-*- mode: erlang -*-
{erl_opts, [warnings_as_errors]}.
{cover_enabled, true}.
{edoc_opts, [{preprocess, true}]}.

{xref_checks, [undefined_function_calls]}.

{deps,
 [{mochiweb, "1.5.1*", {git, "git://github.com/basho/mochiweb.git", {tag, "1.5.1p6"}}},
  {meck, "0.8.1", {git, "git://github.com/basho/meck.git", {tag, "0.8.1"}}},
  {ibrowse, "4.0.1", {git, "git://github.com/cmullaparthi/ibrowse.git", {tag, "v4.0.1"}}}
 ]}.

这是webmachine.app.src文件,它描述了应该运行的应用程序和应用程序的起点(webmachine_app:start / 2)

%%-*- mode: erlang -*-
{application, webmachine,
 [
  {description, "webmachine"},
  {vsn, git},
  {modules, []},
  {registered, []},
  {applications, [kernel,
                  stdlib,
                  crypto,
                  mochiweb]},
  {mod, {webmachine_app, []}},
  {env, []}
 ]}.

最后是启动所有内容的代码:

%% @author Justin Sheehy <justin@basho.com>
%% @author Andy Gross <andy@basho.com>
%% @copyright 2007-2008 Basho Technologies
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
%% You may obtain a copy of the License at
%%
%% http://www.apache.org/licenses/LICENSE-2.0
%%
%% Unless required by applicable law or agreed to in writing, software
%% distributed under the License is distributed on an "AS IS" BASIS,
%% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
%% See the License for the specific language governing permissions and
%% limitations under the License.

%% @doc Callbacks for the webmachine application.

-module(webmachine_app).
-author('Justin Sheehy <justin@basho.com>').
-author('Andy Gross <andy@basho.com>').

-behaviour(application).

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

-include("webmachine_logger.hrl").

%% @spec start(_Type, _StartArgs) -> ServerRet
%% @doc application start callback for webmachine.
start(_Type, _StartArgs) ->
    webmachine_deps:ensure(),
    {ok, _Pid} = SupLinkRes = webmachine_sup:start_link(),
    Handlers = case application:get_env(webmachine, log_handlers) of
        undefined ->
            [];
        {ok, Val} ->
            Val
    end,
    %% handlers failing to start are handled in the handler_watcher
    _ = [supervisor:start_child(webmachine_logger_watcher_sup,
                                [?EVENT_LOGGER, Module, Config]) ||
            {Module, Config} <- Handlers],
    SupLinkRes.

%% @spec stop(_State) -> ServerRet
%% @doc application stop callback for webmachine.
stop(_State) ->
    ok.