簡體   English   中英

檢查Elixir中可選依賴項的可用性

[英]Check availability of optional dependencies in Elixir

我制作了一個十六進制包( Channels ),可選擇依賴於另一個( AMQP )。 我的實現基於Ecto對Mariaex的可選依賴。

在Channels的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 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
...

這可能是我問題的原因嗎? 如果是這樣,有沒有辦法決定我的依賴項的編譯順序?

正如Dogbert所指出的那樣,這是我的錯誤,因為我忘了將最新版本的軟件包推到hex。 我已經完成並正常工作了。

將依賴項指定為可選項會更改編譯順序。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM