Ho creato un pacchetto hex (Channels) che opzionalmente dipende da un altro (AMQP). La mia implementazione si basa sulla dipendenza opzionale di Ecto su Mariaex.Verificare la disponibilità di dipendenze opzionali in Elixir
nei canali mix.exs:
defp deps do
[{:amqp, "0.1.4", optional: true}]
end
Nei canali di file che dipende da AMQP:
if Code.ensure_loaded?(AMQP) do
defmodule Channels.Adapter.AMQP do
...
end
end
L'applicazione si avvia correttamente su dev e prova sono anche passando (compresi quelli che dipendono da AMQP mix test --include amqp_server
).
Ma quando cerco di usare il pacchetto da un altro progetto alcuni problemi sorgono:
Nel mio progetto che sto aggiungendo quanto segue al mio file mix.exs:
def application do
[applications: [:amqp, :channels, ...],
...]
end
defp deps do
[{:amqp, "0.1.4"},
{:channels, "~> 0.1.1"},
...]
end
Quando provo a avviare l'applicazione o eseguire i test che sto ottenendo il seguente errore:
=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
sto aggiungendo AMQP come una dipendenza, ma sembra che Code.ensure_loaded?(AMQP)
sta tornando falso e theref il minerale Channels.Adapter.AMQP
non è in fase di definizione.
Ho notato che nei canali processo di compilazione viene compilato prima di AMQP:
...
==> channels
...
Generated channels app
==> rabbit_common (compile)
==> amqp_client (compile)
==> amqp
...
Generated amqp app
...
Può essere questa la causa del mio problema? In tal caso, c'è un modo per decidere l'ordine di compilazione delle mie dipendenze?
Quale versione di 'canali' stai usando? Vedo solo '0.0.1' pubblicato su hex.pm e questo non include' amqp' come dipendenza opzionale. Guarda come vengono mostrate le dipendenze opzionali, ad es. [Ecto] (https://hex.pm/packages/ecto). – Dogbert
Hai perfettamente ragione. Stavo usando 0.0.1, modificato solo sul mio locale. Ho pubblicato lo 0.0.2 con amqp come dipendenza opzionale e ha funzionato. Il fatto di aggiungerlo come dipendenza opzionale è ciò che cambia l'ordine di compilazione? – jcabot
Sì, questo farebbe sì che il mix li compili nell'ordine corretto. – Dogbert