【发布时间】:2013-07-17 04:44:45
【问题描述】:
在 clojure 中处理应用程序配置的惯用方式是什么?
目前我使用的是这个环境:
;; config.clj
{:k1 "v1"
:k2 2}
;; core.clj
(defn config []
(let [content (slurp "config.clj")]
(binding [*read-eval* false]
(read-string content))))
(defn -main []
(let [config (config)]
...))
这有很多缺点:
-
config.clj的路径可能无法始终正确解析 - 没有明确的方法来为使用的库/框架构建配置部分
- 无法全局访问 (
@app/config)(当然,这可以看作是一种很好的函数式样式方式,但会使跨源文件访问配置变得乏味。
storm 等更大的开源项目似乎使用 YAML 而不是 Clojure,并通过有点丑陋的 hack 使配置在全球范围内可访问:(eval ``(def ~(symbol new-name) (. Config ~(symbol name)))).
【问题讨论】:
-
考虑使用
clojure.edn/read-string而不是绑定*read-eval*。 -
关于分辨率问题,请使用
(slurp (io/resource "config.clj))这也有助于当您的代码成为 jar 中嵌入配置的库时
标签: configuration clojure configure configuration-management idioms