Доступ к переменным из другого пространства имен clojure? - PullRequest
3 голосов
/ 06 января 2011

В моем основном пространстве имен у меня есть переменная верхнего уровня с именем "settings", которая инициализируется как пустое {}.

My -main fn устанавливает содержимое настроек, используя def и con, основываясь на некоторых аргументах командной строки (различные хосты базы данных для производства / разработки и т. Д.).

Я пытаюсь получить доступ к содержимому этой карты из другого пространства имен, чтобы вытащить некоторые настройки. Когда я пытаюсь скомпилировать с помощью lein в uberjar, я получаю трассировку с надписью «Нет таких var: lb / settings».

Чего мне не хватает? Есть ли более идиоматический способ обработки таких настроек приложения, как эти? Безопасно ли использовать «def» внутри -main, как я, или мне следует использовать атом или 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 ]

4 голосов
/ 06 января 2011

Хорошо, я нашел проблему. Похоже, это была круговая ссылка. Я был ": Требуется", используя com.domain.some-other-namespace.core из com.domain.main. Так как «require» вызывается раньше (def settings {}) в com.domain.main, var еще не существует, когда компилируется другое пространство имен ...

Я переместил карту настроек в отдельное пространство имен (естественно, назвал настройки) и изменил ее с Var на Atom, чтобы быть в безопасности. Кажется, теперь отлично работает!

0 голосов
/ 06 января 2011

Пара вещей для проверки:

обычно пространства имен clojure имеют хотя бы одно.в них project.main я думаю, что leiningen может зависеть от этого.

проверьте папку классов, чтобы убедиться, что файлы классов основного и некоторого другого пространства имен компилируются.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...