2016-06-02 3 views
1

Ich schreibe eine Elixir-Bibliothek, deren Verhalten weitgehend von einer vom Benutzer bereitgestellten Wörterbuchdatei abhängt. Ich bearbeite die Datei während der Kompilierung, wie folgt aus:Wie kann ich meinen Bibliothekscode neu kompilieren, wenn sich die Anwendungsumgebung ändert?

defmodule SomeModule do 
    @dictionary Application.get_env(:some_lib, :dictionary_file) 
    |> do_some_processing 

    ... 
end 

Ein übergeordnetes Projekt angeben können ihre die Wörterbuch-Datei verwenden config.exs:

config :some_lib, dictionary_file: "/path/to/dictionary.txt" 

Wenn das übergeordnete Projekt des Besitzers ihre config.exs ändert ein angeben anders dictionary_file, mein Modul muss neu kompiliert werden. Dies geschieht jedoch nicht automatisch, wenn ich mix deps.compile --force im übergeordneten Projekt ausführe.

Elixir liefert @external_resource um auszudrücken "rekompilieren Sie meinen Code, wenn eine bestimmte externe Datei ändert". Aber ich sehe keine Möglichkeit zu sagen "kompiliere meinen Code neu, wenn sich die Anwendungsumgebung ändert".

Wie kann ich das tun?

+0

Ich sollte beachten - ich habe nur meine Bibliothek als eine lokale Abhängigkeit bisher versucht. Ich bin mir nicht sicher, ob das das Verhalten von 'mix deps.compile' beeinflusst. –

Antwort

1

Eine Behelfslösung

Statt meiner Bibliothek Modul die Umgebung mit direkt verwenden, kann ich dies tun: machen die Stammanmeldung ein Modul definieren, die ihre Umgebung verwendet. Anstatt LibraryModule.do_stuff() zu verwenden, rufen sie ParentProjectModule.do_stuff() auf.

ZB:

defmodule ParentProjectModule do 
    @dictionary Application.get_env(:some_lib, :dictionary_file) 
    |> do_some_processing 

    use LibraryModule 
end 

Dann kann ich tun:

defmodule LibraryModule 
    defmacro __using__(_) do 
    quote do 
     # define all my functions, using @dictionary as needed 
    end 
    end 
end 

Wenn die Eltern Anwendungsumgebung ändert, deren Modul neu kompiliert, so verhalten sich die Bibliotheksfunktionen entsprechend.

Verwandte Themen