【发布时间】:2016-08-16 15:25:36
【问题描述】:
我正在使用 rebar3 来生成版本,但是如何在生产中初始化 mnesia?
如果我编写一个执行 mnesia:create_schema([node()]) 的“安装”escript - 它将使用与发布使用的节点名称完全不同的节点名称。
所以我最终为“nonode@nonode”创建了一个模式,而当我使用my-app-1.0.0 start 启动我的应用程序时,生产 mnesia 尝试访问“myapp@localhost”节点。
而且,这是一个先有鸡还是先有蛋的问题:
- 如果没有 mnesia 表,我无法启动我的应用程序
- 如果没有运行我的应用程序,我无法安装我的 mnesia 表(与应用程序将使用的
node()名称相同)。
如果有什么好的方法可以解决这个问题?
这是我独立运行的安装脚本:
#!/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}]).
P.S.:我正在使用 rebar3,它使用 relx 来构建版本。
【问题讨论】: