如果Erlang应用程序myapp需要运行mnesia,那么mnesia
应该包含在其应用程序资源文件中,位于键applications
下,这样如果myapp启动,mnesia将自动启动 - 默认情况下,它的节点类型为opt_disc
(OTP 18)。
如果我想要一个disc
节点怎么办?我知道我可以在命令行设置-mnesia schema_location disc
,但这仅在模式已经存在时有效,这意味着我应该在启动myapp之前执行一些初始化,是否有一个" OTP-ful"方式,而不从mnesia
删除applications
,以避免这种初始化?主要目标是转向" init-then-start"进入"开始"。
答案 0 :(得分:6)
这在你的帖子中是不正确的:
...
mnesia
应该包含在关键应用程序下的应用程序资源文件中,这样如果myapp启动,mnesia就会自动启动。
您在applications
文件中写为.app
键值的应用程序不会自动启动,但它表示必须在应用程序启动之前启动它们。
想象一下,我们想要创建foo
应用程序,该应用程序依赖mnesia
进行一些自定义。一种方法是在foo_app.erl
文件中启动它:
-module(foo_app).
-behaviour(application).
-export([start/2, stop/1]).
start(_Type, _Args) ->
mnesia:start().
mnesia:change_table_copy_type(schema, node(), disc_copies),
%% configure mnesia
%% create your tables
%% ...
foo_sup:start_link().
stop(_State) ->
ok.
这样就创建了disc
模式,无论它是否是之前创建的。
注意:在此解决方案中,如果您在mnesia
文件中的applications
密钥下编写foo.app.src
作为依赖项(在编译时将创建foo.app
}),在启动foo
应用程序时,您获得{error, {not_started, mnesia}}
。所以你不能这样做,让你的应用程序在foo_app:start/2
函数中启动它。