如何在Elixir的Application.start回调中的指定目录中创建mnesia模式?

时间:2019-03-14 06:51:41

标签: elixir mnesia

因此,我有一个Phoenix 1.3应用程序。我读到您必须在应用程序启动之前创建mnesia模式,然后才能创建应用程序表。

在config.exs中,我有:

config :mnesia, 'path/to/mnesia/#{node()}'

在application.ex中:

defmodule MyApp do
  use Application

  def start(_, _args) do
        :mnesia.stop()
        :mnesia.create_schema([node() | Node.list()])
        :mnesia.start()
  end
end

现在,如果我将config.exs中的行注释掉,则会在应用程序的最顶层目录中创建Mnesia.nonode@nohost。但是,如果我尝试在config.exs中指定目录,则会看到类似{:aborted, {:bad_type, :region, :disc_copies, :nonode@nohost}}

的消息

1 个答案:

答案 0 :(得分:0)

问题是config编译时的野兽,不能指望node()在运行时被检索到。将其编译并硬编码为node()编译时返回的结果

也就是说,如果您在节点foo上编译应用程序,则在所有节点上将运行时的配置硬编码为'path/to/mnesia/foo'。 (根据收到的错误,编译似乎发生在:nonode@nohost。)

要解决此问题,您应该将路径的前缀存储在config中,并在运行时在每个节点上通过在前缀上附加mnesia来配置'#{node()}'