В моем основном пространстве имен у меня есть переменная верхнего уровня с именем "settings", которая инициализируется как пустое {}.
My -main fn устанавливает содержимое настроек, используя def и con, основываясь на некоторых аргументах командной строки (различные хосты базы данных для производства / разработки и т. Д.).
Я пытаюсь получить доступ к содержимому этой карты из другого пространства имен, чтобы вытащить некоторые настройки. Когда я пытаюсь скомпилировать с помощью lein в uberjar, я получаю трассировку с надписью «Нет таких var: lb / settings».
Чего мне не хватает? Есть ли более идиоматический способ обработки таких настроек приложения, как эти? Безопасно ли использовать «def» внутри -main, как я, или мне следует использовать атом или ref, чтобы сделать этот потокобезопасным?
Спасибо!
(ns com.domain.main
(:use com.domain.some-other-namespace.core)
(:gen-class))
(def settings {})
(defn -main [& args]
(with-command-line-args... ;set devel? based on args
(if (true? devel?)
(def settings (conj settings {:mongodb {:host "127.0.0.1"}
:memcached {:host "127.0.0.1"}}))
(def settings (conj settings {:mongodb {:host "PRODUCTION_IP"}
:memcached {:host "PRODUCTION_IP"}})))
;file2.clj
(ns com.domain.some-other-namespace.core
(:require [main :as lb]
...)
;configure MongoDB
(congo/mongo!
:db "dbname" :host (:host (mongodb lb/settings))))
...