2016-05-27 17 views
9

Tôi đã tạo gói hex (Channels) tùy chọn phụ thuộc vào một gói khác (AMQP). Việc triển khai của tôi dựa trên sự phụ thuộc tùy chọn của Ecto trên Mariaex.Kiểm tra tính khả dụng của các phụ thuộc tùy chọn trong Elixir

Trong kênh mix.exs:

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

Trong Channels' tập tin mà phụ thuộc vào AMQP:

if Code.ensure_loaded?(AMQP) do 

    defmodule Channels.Adapter.AMQP do 
    ... 
    end 

end 

Các ứng dụng được khởi động đúng trên dev và thử nghiệm cũng đang đi qua (bao gồm cả những phụ thuộc vào AMQP mix test --include amqp_server).

Nhưng khi tôi cố gắng sử dụng các gói từ một dự án khác một số vấn đề nảy sinh:

Trong dự án của tôi tôi thêm phần sau đây để mix.exs tập tin của tôi:

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

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

Khi tôi cố gắng khởi động ứng dụng hoặc chạy các bài kiểm tra tôi nhận được lỗi sau:

=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 

tôi thêm AMQP như một sự phụ thuộc nhưng có vẻ như đang trở lại Code.ensure_loaded?(AMQP) sai và theref quặng Channels.Adapter.AMQP không được xác định.

tôi đã nhận thấy rằng trong quá trình biên dịch kênh đã được biên soạn trước AMQP:

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

này có thể là nguyên nhân của vấn đề của tôi? Nếu vậy, có cách nào để quyết định thứ tự biên dịch của các phụ thuộc của tôi không?

+1

Bạn đang sử dụng phiên bản 'kênh' nào? Tôi chỉ thấy '0.0.1' được xuất bản trên hex.pm và không bao gồm' amqp' như là một phụ thuộc tùy chọn. Xem cách phụ thuộc tùy chọn được hiển thị cho ví dụ: [ecto] (https://hex.pm/packages/ecto). – Dogbert

+0

Bạn hoàn toàn đúng. Tôi đã sử dụng 0.0.1, chỉ thay đổi điều đó trên địa phương của tôi. Tôi đã xuất bản 0.0.2 với amqp là phụ thuộc tùy chọn và nó hoạt động. Thực tế thêm nó như là một phụ thuộc tùy chọn là những gì thay đổi thứ tự biên dịch? – jcabot

+0

Có, điều đó sẽ làm cho việc kết hợp biên dịch chúng theo đúng thứ tự. – Dogbert

Trả lời

2

Như Dogbert đã chỉ ra rằng đó là lỗi của tôi vì tôi quên đẩy phiên bản mới nhất của gói xuống hex. Tôi đã thực hiện nó và làm việc đúng cách.

Chỉ định phụ thuộc là tùy chọn sẽ thay đổi thứ tự biên dịch.

+0

Bạn nên chấp nhận câu trả lời này –

Các vấn đề liên quan