如果Erlang应用程序myapp需要运行mnesia,则应在其应用程序资源文件中的mnesia
键下包含applications
,这样,如果启动myapp,mnesia将自动启动-默认情况下,其节点类型为opt_disc
(OTP 18 )。
如果我想要一个disc
节点怎么办?我知道我可以在命令行中设置-mnesia schema_location disc
,但是这仅在模式已经存在的情况下有效,这意味着我应该在启动myapp之前执行一些初始化,是否有一种“OTP-ful”方式,而无需从mnesia
中删除applications
,以避免这种情况初始化?主要目标是将“先启动然后启动”转变为“启动”。
最佳答案
根据您的帖子,这是不正确的:
您在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
函数启动它。关于Erlang:创建光盘模式,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/34784355/