Sembra che il modo in cui vengono caricati e compilati i file di configurazione in phoenix costituisca un problema quando si utilizzano moduli di terze parti in config.exs
o dev.exs/prod.exs/test.exs
.Elixir/Phoenix: come utilizzare i moduli di terze parti nei file di configurazione?
Esempio: per impostare Guardian per l'autenticazione JWT, sto tentando di utilizzare il modulo JOSE.JWK
per la creazione/caricamento JWK nel mio config.exs
. Posso usare il modulo nella console con iex -S mix phoenix.server
. È ovviamente installato come dipendenza. L'errore che sto ricevendo è
** (Mix.Config.LoadError) could not load config config/config.exs
** (UndefinedFunctionError) undefined function JOSE.JWK.from_file/2 (module JOSE.JWK is not available)
Questo è il codice nelle mie config.exs
# Configure Guardian for JWT Authentication
config :guardian, Guardian,
allowed_algos: ["HS512"], # optional
verify_module: Guardian.JWT, # optional
issuer: "MyApp",
ttl: { 30, :days },
verify_issuer: true, # optional
secret_key: System.get_env("GUARDIAN_KEY_PASSPHRASE") |> JOSE.JWK.from_file(System.get_env("GUARDIAN_KEY_FILE")),
serializer: MyApp.GuardianSerializer
Funziona quando mi avvolgo la chiamata a JOSE.JWK.from_file/2
in una funzione anonima. Ma, naturalmente, il valore della Guardian.config (: SECRET_KEY) è quindi la stessa funzione anonima e non il suo valore di ritorno:
# Configure Guardian for JWT Authentication
config :guardian, Guardian,
allowed_algos: ["HS512"], # optional
verify_module: Guardian.JWT, # optional
issuer: "MyApp",
ttl: { 30, :days },
verify_issuer: true, # optional
secret_key: fn -> System.get_env("GUARDIAN_KEY_PASSPHRASE") |> JOSE.JWK.from_file(System.get_env("GUARDIAN_KEY_FILE")) end,
serializer: MyApp.GuardianSerializer
Questo è ok in questo esempio, dal Guardiano accetta una funzione per questo valore di configurazione. Ma posso immaginare altre situazioni in cui questo potrebbe essere un problema.
Questa limitazione è di proposito? Mi sto perdendo qualcosa? C'è un modo per aggirare questo?
La stessa domanda si applica all'accesso alle funzioni dall'app stessa, piuttosto che a una dipendenza. Questo sta causando dolore a https://github.com/trenpixster/addict/issues/105 –
Sei sicuro? Come funziona 'config: my_app, MyApp.Endpoint,' funziona? – asiniy
@asiniy 'MyApp.Endpoint' è solo un atomo. Se fosse 'MyApp.Endpoint.foo()', sarebbe una chiamata di funzione e avrebbe bisogno di compilare il modulo dipendente. – Emil