私のメインネームスペースには、{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))))
...
すべての名前空間に「。」が含まれています。それらの中に。私は自分の名前空間にcom.domain.moduleの書式を使用しています。私はそれを簡単にしておきました。 lb/settingsにアクセスしようとする前にうまくいきました。 – erikcw