因此,我有一个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}}
答案 0 :(得分:0)
问题是config
是编译时的野兽,不能指望node()
在运行时被检索到。将其编译并硬编码为node()
在编译时返回的结果。
也就是说,如果您在节点foo
上编译应用程序,则在所有节点上将运行时的配置硬编码为'path/to/mnesia/foo'
。 (根据收到的错误,编译似乎发生在:nonode@nohost
。)
要解决此问题,您应该将路径的前缀存储在config
中,并在运行时在每个节点上通过在前缀上附加mnesia
来配置'#{node()}'
。