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

问题描述 投票:0回答:1

所以我有一个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}}这样的消息

elixir mnesia
1个回答
0
投票

问题是config是一个编译时的野兽,不能指望在运行时检索node()。它编译并硬编码为node()在编译时返回的内容。

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

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

© www.soinside.com 2019 - 2024. All rights reserved.