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?
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
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
Ja, das würde den Mix in die richtige Reihenfolge bringen. – Dogbert