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