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