2011-01-05 71 views
3

在我的主命名空间中,我有一个名为“settings”的顶级var,它被初始化为空{}。从另一个clojure命名空间访问变量?

我 - 主FN设置使用DEF连接词设置和基于一些命令行参数(生产/开发不同的数据库主机等)中的内容。

我试图从另一个命名空间访问该地图的内容,拉出一些设置。当我试图用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)))) 
... 

回答

0

几件事情要检查:

通常Clojure的命名空间至少有一个。在他们project.main我认为leiningen可能取决于此。

检查类文件夹,以确保主要和某些其他的命名空间类文件正在编制。

+0

所有的名称空间都有“。”在他们中。我为我的命名空间使用com.domain.module格式。为了简单起见,我放弃了它。在我开始尝试访问磅/设置之前它运行良好。 – erikcw 2011-01-06 04:41:11

4

好吧,我发现这个问题。它看起来像是一个循环引用。我是“:需要”来自com.domain.main的com.domain.some-other-namespace.core。由于“require”在com.domain.main之前被调用(def settings {}),所以当另一个名称空间被编译时var还不存在...

我将设置映射移动到单独的名称空间命名设置),并将其从Var更改为Atom以保证安全。似乎现在工作得很好!