2011-01-05 73 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以保證安全。似乎現在工作得很好!