Es scheint, dass die Art, wie Konfigurationsdateien in Phoenix geladen und kompiliert werden, ein Problem darstellt, wenn Module von Drittanbietern in config.exs
oder dev.exs/prod.exs/test.exs
verwendet werden.Elixir/Phoenix: Wie man Module von Drittanbietern in Konfigurationsdateien verwendet?
Beispiel: Zum Einrichten Guardian für JWT-Authentifizierung Ich versuche, das JOSE.JWK
Modul für JWK Erstellung/Laden in meinem config.exs
zu verwenden. Ich kann das Modul in der Konsole in Ordnung mit iex -S mix phoenix.server
verwenden. Es ist natürlich als Abhängigkeit installiert. Der Fehler Ich erhalte ist
** (Mix.Config.LoadError) could not load config config/config.exs
** (UndefinedFunctionError) undefined function JOSE.JWK.from_file/2 (module JOSE.JWK is not available)
Dies ist der Code in meinem 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
Es funktioniert, wenn ich den Anruf zu JOSE.JWK.from_file/2
in einer anonymen Funktion wickeln. Aber natürlich ist der Wert von Guardian.config (: secret_key) ist dann die anonyme Funktion selbst und nicht deren Rückgabewert:
# 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
Das ist in Ordnung, in diesem Beispiel, da Wächter eine Funktion für diesen Konfigurationswert akzeptiert. Aber ich kann mir andere Situationen vorstellen, in denen das ein Problem sein könnte.
Ist diese Beschränkung absichtlich? Fehle ich etwas? Gibt es einen Weg dahin?
Die gleiche Frage gilt für den Zugriff auf Funktionen von der App selbst, anstatt eine Abhängigkeit. Dies verursacht Schmerzen bei https://github.com/trenpixster/addict/issues/105 –
Sind Sie sicher? Wie funktioniert 'config: my_app, MyApp.Endpoint,'? – asiniy
@asiniy 'MyApp.Endpoint' ist nur ein Atom. Wenn es "MyApp.Endpoint.foo()" wäre, wäre es ein Funktionsaufruf und würde erfordern, dass das abhängige Modul kompiliert wird. – Emil