是否有办法在"嵌入式"中运行(Erlang版本)Webmachine ?我想嵌入的web应用程序在一个应用程序,我正在写。web应用程序将只是一个前端与后端我写通信。我想要一切(webmachine, mochiweb,自定义web应用程序,自定义后端)在一个代码库,运行在一个虚拟机上。
谢谢。
Rebar提供了方便的方法来构建应用程序版本和管理它们的依赖关系。由于这个主题非常复杂,我建议您查看一下非常好的站点learnyousomeerlang(我指出了关于发布的那一章),以了解Rebar使用的底层方法。您还需要对OTP中应用程序的启动方式有很好的了解。
在您的示例中,后端是应用程序,所有其他应用程序都是依赖项。
[编辑]我不会说您必须用Erlang构建应用程序。由于没有链接,当VM需要它们时,所有模块都必须在代码/库搜索路径中。甚至可以在运行时修改此路径。
OTP定义了组织不同文件的标准方法,VM定义了组织库的方法。钢筋所做的,是帮助你为你的应用和它所依赖的那些创建和维护这个组织。它可以帮助您从存储库中检索所需的应用程序,并简化整个过程的构建。因此,它可以帮助您将应用程序分发给其他用户/机器。
你可以看看webmachine代码本身,因为它使用钢筋来构建自己,并获得它所依赖的应用程序(mochiweb, meck和ibrowse)。以下是一些文件的副本,可从https://github.com/basho/webmachine获得,使用Apache License, Version 2.0。钢筋。描述依赖项和"编译"选项的配置文件:
%%-*- 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.