包括应用 | 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