In meinem Haupt-Namespace habe ich eine Top-Level-Variable mit dem Namen "settings", die als leeres {} initialisiert wird.Zugriff auf vars aus einem anderen Clojure-Namespace?
Mein -main fn legt den Inhalt der Einstellungen mit def und conj basierend auf einigen Befehlszeilenargumente fest (verschiedene Datenbankhosts für Produktion/Entwicklung usw.).
Ich versuche auf den Inhalt dieser Karte von einem anderen Namespace zuzugreifen, um einige der Einstellungen herauszuziehen. Wenn ich versuche, mit lein in einen Uberjar zu kompilieren, bekomme ich eine Rückverfolgung mit der Aufschrift "No so var: lb/settings".
Was fehlt mir? Gibt es eine eher idiomatische Möglichkeit, mit solchen App-weiten Einstellungen umzugehen? Ist es sicher, "def" innerhalb von -main zu verwenden, wie ich es bin, oder sollte ich ein Atom oder einen Verweis verwenden, um diesen Thread sicher zu machen?
Danke!
(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))))
...
Alle Namespaces haben "." in ihnen. Ich verwende com.domain.module Formatierung für meine Namespaces. Ich habe es der Einfachheit halber weggelassen. Es hat gut funktioniert, bevor ich anfing, auf lb/settings zuzugreifen. – erikcw