检查Elixir

时间:2016-05-27 08:39:10

标签: elixir

我制作了一个十六进制包(Channels),可选择依赖另一个(AMQP)。我的实现基于Ecto对Mariaex的可选依赖。

在频道' mix.exs:

defp deps do
  [{:amqp, "0.1.4", optional: true}]
end

在频道'依赖于AMQP的文件:

if Code.ensure_loaded?(AMQP) do

  defmodule Channels.Adapter.AMQP do
    ...
  end

end

应用程序在开发时正常启动,测试也正在通过(包括依赖于AMQP mix test --include amqp_server的那些)。

但是当我尝试使用其他项目中的包时会出现一些问题:

在我的项目中,我将以下内容添加到mix.exs文件中:

def application do
  [applications: [:amqp, :channels, ...],
   ...]
end

defp deps do
  [{:amqp, "0.1.4"},
   {:channels, "~> 0.1.1"},
   ...]
end

当我尝试启动应用程序或运行测试时,我收到以下错误:

=INFO REPORT==== 27-May-2016::10:28:35 ===
application: logger
exited: stopped
type: temporary
** (Mix) Could not start application channels: Channels.start(:normal, []) returned an error: shutdown: failed to start child: Channels.Monitor.Supervisor
  ** (EXIT) shutdown: failed to start child: :main
    ** (EXIT) an exception was raised:
      ** (UndefinedFunctionError) undefined function Channels.Adapter .AMQP.connect/1 (module Channels.Adapter.AMQP is not available)
          Channels.Adapter.AMQP.connect([])
          (channels) lib/channels/monitor.ex:42: Channels.Monitor.init/1
          (stdlib) gen_server.erl:328: :gen_server.init_it/6
          (stdlib) proc_lib.erl:240: :proc_lib.init_p_do_apply/3

我将AMQP添加为依赖项,但似乎Code.ensure_loaded?(AMQP)返回false,因此Channels.Adapter.AMQP未定义。

我注意到在编译过程中频道正在AMQP之前编译:

...
==> channels
...
Generated channels app
==> rabbit_common (compile)
==> amqp_client (compile)
==> amqp
...
Generated amqp app
...

这可能是我问题的原因吗?如果是这样,有没有办法决定我的依赖项的编译顺序?

1 个答案:

答案 0 :(得分:2)

正如Dogbert指出这是我的错误,因为我忘了把最新版本的软件包推到十六进制。我已经完成并正常工作。

将依赖项指定为可选项确实会更改编译顺序。