我正在使用 rebar3 发布版本,但是如何在生产中初始化 mnesia?
如果我编写一个“安装”escript 来执行mnesia:create_schema([node()])
- 它将使用与发布使用的节点名称完全不同的节点名称。
my-app-1.0.0 start
因此,当我启动我的应用程序并尝试访问“myapp@localhost”节点时,我最终为“nonode@nonode”创建了一个模式。
此外,这是一个先有鸡还是先有蛋的问题:
- 没有 mnesia 表我无法启动我的应用程序
node()
没有运行我的应用程序(与应用程序将使用的名称相同),我无法安装我的 mnesia 表。
只是徘徊,如果有一个很好的方法来处理这个?
这是我独立运行的安装脚本:
#!/usr/bin/env escript
%% -*- erlang -*-
%%! -smp enable ls-mnesia debug verbose
-include("../include/rr.hrl").
main(_) ->
application:set_env(mnesia, dir, "/usr/local/src/db/mnesia"),
application:stop(mnesia),
install([node()|nodes()]).
install(Nodes) ->
case mnesia:create_schema(Nodes) of
ok ->
rpc:multicall(Nodes, application, start, [mnesia]),
read_store_create_tables(Nodes),
event_store_create_tables(Nodes),
rpc:multicall(Nodes, application, stop, [mnesia]);
Err ->
error_logger:warning_msg("Could not create schema: ~p~n", [Err]),
Err
end.
event_store_create_tables(Nodes) ->
{_, ok} = mnesia:create_table(rr_events,
[{attributes, record_info(fields, rr_events)},
{disc_copies, Nodes},
{type, bag}]).
read_store_create_tables(Nodes) ->
% Initialize the actual data-tables for the projections
{_, ok} = mnesia:create_table(rr_competencies,
[{attributes, record_info(fields, rr_competencies)},
{disc_copies, Nodes}]).
PS:我正在使用rebar3
which usesrelx
来构建版本。