【发布时间】:2018-10-13 12:37:07
【问题描述】:
在我的 Clojure 项目中,我使用命名空间来存储配置:
(ns clojure-bgproc.settings
(:require [environ.core :refer [env]]
[clojure.edn :as edn]))
(def ^:dynamic *app-env* (env :app-env "production"))
(def ^:private config-path
(if (= *app-env* "test") "settings_test.edn" "settings.edn"))
(def config (-> config-path slurp edn/read-string))
(def db-config (:db config))
对于测试环境,我使用一个fixture重新定义*app-env*:
(ns helpers.config
(:require [clojure-bgproc.settings :refer :all]))
(defn with-test-config [f]
(with-redefs [*app-env* "test"]
(f)))
虽然 *app-env* 被重新定义,但所有其他配置变量都没有:
FAIL in (app-config-test) (core_test.clj:14)
expected: (s/ends-with? (:dbname db-config) "test")
actual: (not (s/ends-with? "rmq-reports-development" "test"))
有没有一种方法可以让我轻松地重新定义所有其他配置变量,而无需我手动重新计算它们?
【问题讨论】:
-
使用函数而不是变量?
-
我猜这是一种方式。我只是想知道是否有更好的方法...
-
@art-solopov 这是一个完美的例子,说明函数在哪里是合适的。您甚至可以将
app-env作为函数的参数,这样它的数据要求就很明确了。那么数据来自哪里或定义在哪里都无关紧要。依赖被定义的全局变量会产生相当大的副作用。
标签: clojure