Что такое идиоматический способ обработки конфигурации приложения в clojure?
Пока я использую эту среду:
;; config.clj
{:k1 "v1"
:k2 2}
;; core.clj
(defn config []
(let [content (slurp "config.clj")]
(binding [*read-eval* false]
(read-string content))))
(defn -main []
(let [config (config)]
...))
У меня много недостатков:
- Путь к
config.clj
может не всегда корректно разрешаться - Нет четкого способа структурирования разделов конфигурации для используемых библиотек/фреймворков
- Не доступен по всему миру (
@app/config
) (что, конечно же, можно рассматривать как удобный способ функционального стиля, но делает доступ к конфигурации через исходный файл утомительным.
Большие проекты с открытым исходным кодом, такие как шторм, похоже, используют YAML вместо Clojure и делают доступную конфигурацию доступной по всему миру с помощью немного уродливого взлома: (eval ``(def ~(symbol new-name) (. Config ~(symbol name)))).