2016-01-14 2 views
4

Si une application Erlang, myapp, nécessite mnesia, alors mnesia doit être inclus dans son fichier de ressources d'application, sous la clé applications, de sorte que si myapp est démarré, mnesia démarre automatiquement - c'est Le type de nœud par défaut est opt_disc (OTP 18). Et si je veux un noeud disc?Erlang: créer un schéma de disque

Je sais que je peux définir -mnesia schema_location disc en ligne de commande, mais cela ne fonctionne que si un schéma existe déjà, ce qui signifie que je devrais effectuer une initialisation avant de démarrer myapp, y-a-t-il un OTP-ful sans mnesia de applications, pour éviter cela initialisation? L'objectif principal est de transformer "init-then-start" en "start".

Répondre

5

Ce n'est pas correct de votre message:

... mnesia devrait être inclus dans le fichier de ressources d'application, dans les principales applications, de sorte que si myapp est commencé, mnesia obtiendriez démarré automatiquement.

Les applications que vous écrivez en tant que valeur de applications clé dans le fichier .app ne, mais il dit ne démarrent pas automatiquement qu'ils doivent être démarrés avant votre application est lancée.


Imaginez que nous voulons créer l'application foo qui dépend de mnesia avec une certaine personnalisation. Une façon commence dans foo_app.erl fichier:

-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. 

De cette façon, il crée le schéma disc s'il a été créé avant ou non.


Remarque: Dans cette solution si vous écrivez mnesia comme la dépendance sous applications clé dans votre fichier foo.app.src (qui dans le temps de la compilation créerait foo.app), vous obtenez {error, {not_started, mnesia}} lors du démarrage de l'application foo. Donc vous ne devez pas le faire et laissez votre application le démarrer dans sa fonction foo_app:start/2.

+0

Techniquement, vous avez raison, mais si vous utilisez release, [systools utilise cette liste pour générer des scripts de démarrage corrects] (http://www.erlang.org/doc/man/app.html), donc je ne sais pas J'ai besoin de 'mnesia: start/0' moi-même,' mnesia: change_table_copy_type/3' fonctionne :) –

+0

@NotanID Oui, utiliser 'release' est une autre option qui démarre les dépendances automatiquement. –