Erlang: как я могу автоматически запустить все необходимые приложения для приложения? - PullRequest
7 голосов
/ 15 июня 2011

У меня есть необходимые приложения в файле st_db.app, такие как:

{application, st_db,
 [
  {description, ""},
  {vsn, "1.0.0"},
  {registered, []},
  {modules, [st_db_app, st_db_sup, st_db]},
  {applications, [
                  kernel,
                  stdlib,
          sasl,
          crypto,
          ibrowse,
          couchbeam
                 ]},
  {mod, { st_db_app, []}},
  {env, []}
 ]}.

Мне нужно запустить их (crypto, sasl и т. Д.) Автоматически для запуска и отладки основного приложения.Единственное решение, которое я нашел, - это запустить erl с такими параметрами:

erl -pa ./ebin -pa ./deps/*/ebin -boot start_sasl -s couchbeam -s crypto -s ibrowse 

Это единственный способ?

PS: кстати, couchbeam не запускается на узле.Он просто запускает супервизор couchbeam, поэтому мне нужно запустить его в оболочке вручную

=PROGRESS REPORT==== 15-Jun-2011::10:22:43 ===
          supervisor: {local,couchbeam_sup}
             started: [{pid,<0.62.0>},
                       {name,couchbeam},
                       {mfargs,{couchbeam,start_link,[]}},
                       {restart_type,permanent},
                       {shutdown,2000},
                       {child_type,worker}]

2> application:start(couchbeam).
ok
3> 
=PROGRESS REPORT==== 15-Jun-2011::10:23:25 ===
          supervisor: {local,couchbeam_sup}
             started: [{pid,<0.69.0>},
                       {name,couchbeam},
                       {mfargs,{couchbeam,start_link,[]}},
                       {restart_type,permanent},
                       {shutdown,2000},
                       {child_type,worker}]

=PROGRESS REPORT==== 15-Jun-2011::10:23:25 ===
         application: couchbeam
          started_at: nonode@nohost

Есть ли способ это исправить?

Ответы [ 4 ]

5 голосов
/ 16 сентября 2012

Если вы просто бездельничаете в консоли и не хотите вводить все эти «application: start (...)».линии, просто поместите эти вещи в файл .erlang в вашем текущем рабочем каталоге.Вот пример того, над чем я сейчас работаю:

$ cat .erlang 
application:start(crypto).
application:start(public_key).
application:start(ssl).
application:start(ibrowse).
application:start(foo).

Это запустит все мои зависимости, а затем приложение, над которым я сейчас работаю, foo.* Если вы хотите сгенерировать релиз reltool с арматурой, эта ссылка может помочь:

Когда использовать приложение erlang: запуск или включены_приложения и супервизор?эта суть:

https://gist.github.com/3728780

-Todd

4 голосов
/ 15 июня 2011

Либо вы можете выполнить серию команд -eval "application: start (coucnbeam)" для erl, либо сделать это надлежащим образом OTP и использовать reltool для создания нового загрузочного файла для вас.

См. http://www.erlang.org/doc/man/reltool.html для получения информации о reltool. Кроме того, арматура отлично справляется с тяжелой работой для вас, так что вы можете также изучить это (http://github.com/basho/rebar)

1 голос
/ 08 апреля 2017

Есть способ запустить все зависимые приложения.Пожалуйста, пройдите через приложение :ure_all_started API на http://erlang.org/doc/apps/kernel/application.html#ensure_all_started-1

0 голосов
/ 08 апреля 2017

В вашем модуле обратного вызова приложения просто напишите:

-module(st_db_app).
-behaviour(application).
-export([start/2, stop/1]).

start(_StartType, _StartArg) ->
    %% Get application name
    {ok, AppName} = application:get_application(),
    %% Start all dependencies that are not yet started for application name
    {ok, _StartedApps} = application:ensure_all_started(AppName),
    %% start application's root supervisor or do other initialization here
    %% and return root supervisor's pid.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...