在clojure中使用yogthos / config时,配置文件之间的共享env变量?

https://github.com/yogthos/config方法允许您在project.clj中的单独文件(如下所示)中布置每个配置文件的env变量.

根据下面的内容,可以使用lein with-profile prod uberjar或lein with-profile dev repl等.

但我的问题是我无法弄清楚如何将一些共同的值放入共享区域,可由dev,stage,prod配置文件访问.

基本的例子

(defproject edn-config-test "0.1.0-SNAPSHOT"
...
:profiles {:shared  {:resource-paths ["config/shared"]}
           :dev  {:resource-paths ["config/dev"]}
           :stage {:resource-paths ["config/stage"]} 
           :prod {:resource-paths ["config/prod"]}}
...

(带文件)

config/shared/config.edn
config/dev/config.edn
config/stage/config.edn
config/prod/config.edn

我没试好就试过了

lein with-profile sharing,prod lein,借用复合方法
https://github.com/technomancy/leiningen/blob/stable/doc/PROFILES.md#composite-profiles

例如,当我这样做时,我只在prod配置文件中获取变量.

最佳答案 我认为这是配置的限制.我试过这个(更明确):

:profiles {:dev    {:resource-paths ["config/shared" "config/dev"]}
           :prod   {:resource-paths [ "config/prod"  "config/shared"]}}

但是,最后一个文件获胜,第一个文件被忽略.所以对于:dev共享的东西被忽略了,并且:prod prod的东西被忽略了(就像它不存在):

config/dev/config.edn             => {:special-val :dev-val}
config/prod/config.edn            => {:special-val :prod-val}
cat config/shared/config.edn      => {:shared-val 42}

和结果:

> lein with-profile prod  run
(:shared-val env)  => 42
(:special-val env) => nil

> lein with-profile dev   run
(:shared-val env)  => nil
(:special-val env) => :dev-val

也许您想要为项目提交增强PR?

这是问题所在.它使用io / resource来读取config.edn,它隐含地期望在类路径的任何地方只有一个文件config.edn:

(defn- read-config-file [f]
  (try
    (when-let [url (io/resource f)]
      (with-open [r (-> url io/reader PushbackReader.)]
        (edn/read r))) ...

(read-config-file "config.edn")

因此,您必须远离硬编码的文件名config.edn,并制作类似config-dev.edn,config-prod.edn和config-shared.edn的内容.至少那时他们都可以住在一个./resources目录中.

点赞