2011-01-05 22 views
3

私のメインネームスペースには、{settings}という空の{}として初期化されたトップレベルのvarがあります。他のclojure名前空間からの変数へのアクセス?

My -main fnは、いくつかのコマンドライン引数(production/developmentなどの異なるデータベースホスト)に基づいて、defとconjを使用して設定の内容を設定します。

私はこのマップの内容に別の名前空間からアクセスして、いくつかの設定を取り出そうとしています。私がUberjarにleinでコンパイルしようとすると、 "No such var:lb/settings"というトレースバックが出ます。

私には何が欠けていますか?これらのようなアプリのワイドな設定を処理するための慣用的な方法はありますか?私のように "def"を-mainの中で使うのは安全ですか?あるいは、このスレッドセーフを作るために原子やリファレンスを使うべきですか?

ありがとうございます!

(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の名前空間には、少なくとも1つを持っています。それらの中にproject.main私はleiningenがこれに依存するかもしれないと思う。

mainとsome-other-namespaceクラスファイルがコンパイルされていることを確認するには、classesフォルダを確認してください。

+0

すべての名前空間に「。」が含まれています。それらの中に。私は自分の名前空間にcom.domain.moduleの書式を使用しています。私はそれを簡単にしておきました。 lb/settingsにアクセスしようとする前にうまくいきました。 – erikcw

4

[OK]を問題が見つかりました。それは循環参照のように見えます。私はcom.domain.mainから ":require" com.domain.some-other-namespace.coreでした。 com.domain.mainでは "require"が呼び出されているので(def settings {})、他の名前空間がコンパイルされてもvarはまだ存在しません。

設定マップを別の名前空間に移動しました自然に名前を付けた設定)、安全のためにVarからAtomに変更しました。今すぐ素晴らしい仕事をしているようだ!

関連する問題