3

我正在使用 rebar3 发布版本,但是如何在生产中初始化 mnesia?

如果我编写一个“安装”escript 来执行mnesia:create_schema([node()])- 它将使用与发布使用的节点名称完全不同的节点名称。

my-app-1.0.0 start因此,当我启动我的应用程序并尝试访问“myapp@localhost”节点时,我最终为“nonode@nonode”创建了一个模式。

此外,这是一个先有鸡还是先有蛋的问题:

  1. 没有 mnesia 表我无法启动我的应用程序
  2. 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:我正在使用rebar3which usesrelx来构建版本。

4

1 回答 1

1

我正在使用我自己的构建系统,该系统主要是因为这个确切的要求而编写的——能够在启动节点之前安装和初始化节点。这个想法很简单:有两个版本,在这个特殊的例子中叫做cmdand humbundee。该cmd版本不会启动主要应用程序,只会加载它们。然后执行一个特殊函数来初始化节点。该功能在reltool.config文件中配置。在这种情况下,它hbd_setup来自deploy应用。该函数读取配置文件并从备份创建和初始化 mnesia 数据库,或者如果备份不存在则创建一个新数据库。一旦安装了节点,它就会使用正确的版本启动。在开发(直接从源代码)和生产(从 OTP 版本)中执行相同的步骤。

使用该设置,您描述的问题不存在,因为两个版本都是从同一位置启动的,使用几乎相同的命令和配置文件(builderl从 中的配置生成它们reltool.config)。


您可以通过手动或使用某种脚本执行这些步骤,对任何构建工具(包括rebar3and )采用相同的想法。relx

它的作用是builderl它自动执行这些步骤并提供一个环境以在开发和生产中以相同的方式执行它们,例如参见项目的 README文件的底部:humbundee

安装节点。这将启动cmd发布并执行hbd_setup:install/2初始化节点的函数:

./bin/init.esh

启动节点。这将启动humbundee发布,它启动所有应用程序及其相应的主管树:

./bin/start.esh

builderl实际上用于rebar提取和编译依赖于其他项目的依赖项,但是它仅使用 OTP 来创建发布。它还可以使用项目范围的依赖文件自己下载依赖项,然后使用它们进行编译make(编译时不使用正在进行的make工作。我希望这会有所帮助。

于 2016-04-22T23:30:49.627 回答