Erlang:创建光盘模式

Erlang:创建光盘模式,erlang,otp,mnesia,Erlang,Otp,Mnesia,如果Erlang应用程序myapp需要运行mnesia,则应在其应用程序资源文件中的applications键下包含mnesia,这样,如果myapp启动,mnesia将自动启动-默认情况下,其节点类型为opt_disc(OTP 18) 如果我想要一个光盘节点怎么办?我知道我可以在命令行中设置-mnesia schema\u location disc,但这仅在架构已经存在的情况下有效,这意味着我应该在启动myapp之前执行一些初始化,是否有一种“OTP ful”方法,不从应用程序中删除mnes

如果Erlang应用程序myapp需要运行mnesia,则应在其应用程序资源文件中的
applications
键下包含
mnesia
,这样,如果myapp启动,mnesia将自动启动-默认情况下,其节点类型为
opt_disc
(OTP 18)


如果我想要一个
光盘
节点怎么办?我知道我可以在命令行中设置
-mnesia schema\u location disc
,但这仅在架构已经存在的情况下有效,这意味着我应该在启动myapp之前执行一些初始化,是否有一种“OTP ful”方法,不从
应用程序中删除
mnesia
,以避免此初始化?主要目的是将“初始化然后启动”变成“启动”。

这在您的帖子中是不正确的:

mnesia
应包含在其应用程序资源文件的“关键应用程序”下,这样,如果myapp启动,mnesia将自动启动

作为
应用程序
的值编写的应用程序
输入
.app
文件不会自动启动,但它表示必须在启动应用程序之前启动这些应用程序


假设我们想要创建依赖于
mnesia
foo
应用程序,并进行一些定制。一种方法是在
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
schema



注意:在这个解决方案中,如果您将
mnesia
作为依赖项写入
applications
下,请输入
foo.app.src
文件(在编译时将创建
foo.app
),启动
foo
应用程序时,您会得到
{error,{not u start,mnesia}
。因此,您不能让应用程序在其
foo_app:start/2
函数中启动它

技术上你是对的,但是如果你使用release,那么实际上我不需要
mnesia:start/0
我自己,
mnesia:change\u table\u copy\u type/3
工作:)@NotanID是的,使用
release
是自动启动依赖项的另一个选项。