包括应用 | 8. Included Applications

8份包括申请

8.1介绍

应用程序可以包括其他申请。安包括申请有自己的应用程序目录和.app文件,但它是作为另一个应用程序的主管树的一部分启动的。

应用程序只能由另一个应用程序包含。

包含的应用程序可以包括其他应用程序。

任何其他应用程序不包含的应用程序称为初步应用...

图8.1:主要应用程序和包含的应用程序

应用程序控制器在加载主应用程序时自动加载任何包含的应用程序,但不会启动它们。相反,包含的应用程序的最高主管必须由包含应用程序中的主管启动。

这意味着在运行时,包含的应用程序实际上是主应用程序的一部分,而包含的应用程序中的进程认为自己属于主应用程序。

8.2指定包含的应用程序

属性定义要包含的应用程序。included_applications中的键.app档案:

{application, prim_app, [{description, "Tree application"}, {vsn, "1"}, {modules, [prim_app_cb, prim_app_sup, prim_app_server]}, {registered, [prim_app_server]}, {included_applications, [incl_app]}, {applications, [kernel, stdlib, sasl]}, {mod, {prim_app_cb,[]}}, {env, [{file, "/usr/local/log"}]} ]}.

8.3启动过程同步

包含的应用程序的主管树作为包含应用程序的主管树的一部分启动。如果包含和包含的应用程序中的进程之间需要同步,则可以使用启动阶段...

启动阶段由.app文件中的键start_phases定义为元组列表{Phase,PhaseArgs},其中Phase是原子,PhaseArgs则是一个术语。

的值。mod必须将包含应用程序的键设置为{application_starter,[Module,StartArgs]},在哪里Module与往常一样,应用程序回调模块。StartArgs作为回调函数的参数提供的术语。Module:start/2*

{application, prim_app, [{description, "Tree application"}, {vsn, "1"}, {modules, [prim_app_cb, prim_app_sup, prim_app_server]}, {registered, [prim_app_server]}, {included_applications, [incl_app]}, {start_phases, [{init,[]}, {go,[]}]}, {applications, [kernel, stdlib, sasl]}, {mod, {application_starter,[prim_app_cb,[]]}}, {env, [{file, "/usr/local/log"}]} ]}. {application, incl_app, [{description, "Included application"}, {vsn, "1"}, {modules, [incl_app_cb, incl_app_sup, incl_app_server]}, {registered, []}, {start_phases, [{go,[]}]}, {applications, [kernel, stdlib, sasl]}, {mod, {incl_app_cb,[]}} ]}.

当使用包含的应用程序启动主应用程序时,主应用程序将以正常方式启动,即:

  • 应用程序控制器为应用程序创建应用程序主程序。

  • 应用程序主调用Module:start(normal, StartArgs)开始做最高主管。

然后,对于主应用程序和每个包含的应用程序按自顶向下、从左到右的顺序,应用程序主程序调用Module:start_phase(Phase, Type, PhaseArgs)对于为主应用程序定义的每个阶段,按该顺序排列。如果未为包含的应用程序定义阶段,则此阶段和应用程序不会调用该函数。

下列要求适用于.app包含的应用程序的文件:

  • {mod, {Module,StartArgs}}必须包括选项。此选项用于查找回调模块。Module申请。StartArgs被忽略,如Module:start/2只为主应用程序调用。

  • 如果包含的应用程序本身包含包含的应用程序,则{mod, {application_starter, [Module,StartArgs]}}必须包括选项。

  • {start_phases, [{Phase,PhaseArgs}]}选项,并且指定的阶段集必须是为主应用程序指定的阶段集的子集。

开始时prim_app如上所述,应用程序控制器在前面调用以下回调函数application:start(prim_app)返回一个值:

application:start(prim_app) => prim_app_cb:start(normal, []) => prim_app_cb:start_phase(init, normal, []) => prim_app_cb:start_phase(go, normal, []) => incl_app_cb:start_phase(go, normal, []) ok