从另一个clojure命名空间访问变量?

时间:2011-01-05 23:50:39

标签: clojure settings

在我的主命名空间中,我有一个名为“settings”的顶级var,它被初始化为空{}。

My -main fn根据一些命令行参数(用于生产/开发的不同数据库主机等)使用def和conj设置设置的内容。

我正在尝试从另一个命名空间访问此映射的内容以提取一些设置。当我尝试用lein编译成一个uberjar时,我得到一个追溯说“没有这样的var:lb / settings”。

我错过了什么?是否有更惯用的方式来处理这些应用程序的广泛设置?在我内部使用“def”是否安全,或者我应该使用原子或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))))
...

2 个答案:

答案 0 :(得分:4)

答案 1 :(得分:0)

要检查几件事:

通常,clojure名称空间至少有一个。在他们project.main我认为leiningen可能依赖于此。

检查classes文件夹以确保正在编译main和some-other-namespace类文件。