2016-05-27 16 views
9

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?

+1

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

+0

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

+0

Sì, questo farebbe sì che il mix li compili nell'ordine corretto. – Dogbert

risposta

2

Come ha sottolineato Dogbert, è stato un mio errore perché ho dimenticato di inviare l'ultima versione del pacchetto all'esagono. L'ho fatto e ho funzionato correttamente.

Specificare la dipendenza come facoltativo modifica l'ordine di compilazione.

+0

Devi accettare questa risposta –

Problemi correlati