2016-05-27 8 views
9

Ich habe ein Hex-Paket (Channels), die optional auf einem anderen (AMQP) gemacht. Meine Implementierung basiert auf Ectos optionaler Abhängigkeit von Mariaex.Überprüfen Sie die Verfügbarkeit von optionalen Abhängigkeiten in Elixir

In Channels' mix.exs:

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

in den Kanälen Datei, die auf AMQP abhängt:

if Code.ensure_loaded?(AMQP) do 

    defmodule Channels.Adapter.AMQP do 
    ... 
    end 

end 

Starten der Anwendung richtig auf dev und Tests sind vorbei auch (einschließlich das hängt von AMQP mix test --include amqp_server ab).

Aber wenn ich versuche, einige Probleme, das Paket aus einem anderen Projekt zu verwenden, entstehen:

In meinem Projekt ich hinzufüge, die folgend meine mix.exs Datei:

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

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

Wenn ich versuche, die Anwendung starten oder die Tests ausführen ich die folgende Fehlermeldung erhalten:

=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 

ich füge AMQP als Abhängigkeit, aber es scheint, dass Code.ensure_loaded?(AMQP) falsch zurückkehrt und d daher ore Channels.Adapter.AMQP wird nicht definiert.

ich bemerkt habe, dass die Kanäle in den Übersetzungsvorgang vor AMQP kompiliert werden:

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

dies die Ursache für mein Problem sein könnte? Wenn ja, gibt es eine Möglichkeit, die Kompilierreihenfolge meiner Abhängigkeiten zu bestimmen?

+1

Welche Version von 'Kanälen' verwenden Sie? Ich sehe nur '0.0.1', das auf hex.pm veröffentlicht wird und das' amqp' nicht als optionale Abhängigkeit enthält. Sehen Sie, wie optionale Abhängigkeiten z. [ecto] (https://hex.pm/packages/ecto). – Dogbert

+0

Sie sind völlig richtig. Ich benutzte 0.0.1, änderte nur das auf meinem lokalen. Ich habe die 0.0.2 mit amqp als optionale Abhängigkeit veröffentlicht und es hat funktioniert. Die Tatsache, dass es als optionale Abhängigkeit hinzugefügt wird, verändert die Reihenfolge der Kompilierung. – jcabot

+0

Ja, das würde den Mix in die richtige Reihenfolge bringen. – Dogbert

Antwort

2

Als Dogbert wies darauf hin, es war mein Fehler, weil ich vergessen habe, die neueste Version des Pakets auf Hex zu schieben. Ich habe es getan und richtig gearbeitet.

Die Angabe der Abhängigkeit als optional ändert die Kompilierreihenfolge.

+0

Sie sollten diese Antwort akzeptieren –

Verwandte Themen