【问题标题】:Check availability of optional dependencies in Elixir检查 Elixir 中可选依赖项的可用性
【发布时间】:2016-09-25 12:22:20
【问题描述】:

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

在 Channels 的 mix.exs 中:

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

在依赖于 AMQP 的 Channels 文件中:

if Code.ensure_loaded?(AMQP) do

  defmodule Channels.Adapter.AMQP do
    ...
  end

end

应用程序在 dev 上正常启动,并且测试也通过了(包括那些依赖于 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

我注意到在编译过程中 Channels 是在 AMQP 之前编译的:

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

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

【问题讨论】:

  • 您使用的是哪个版本的channels?我只看到在 hex.pm 上发布的 0.0.1 并且不包括 amqp 作为可选依赖项。查看可选依赖项是如何显示的,例如ecto.
  • 你完全正确。我使用的是 0.0.1,只是在我的本地进行了更改。我发布了带有 amqp 的 0.0.2 作为可选依赖项,它起作用了。添加它作为可选依赖项的事实是什么改变了编译顺序?
  • 是的,这将使 mix 以正确的顺序编译它们。

标签: elixir


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 2015-11-15
    • 1970-01-01
    • 1970-01-01
    • 2021-09-17
    • 1970-01-01
    • 2011-09-08
    • 2016-03-12
    • 1970-01-01
    • 2012-06-03
    相关资源
    最近更新 更多