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

在clojure中使用yogthos/config时在配置文件之间共享环境变量?,clojure,environment-variables,config,profile,Clojure,Environment Variables,Config,Profile,通过这种方法,您可以在project.clj中的单独文件(如下所示)中布局每个概要文件的环境变量 根据以下内容,可以将lein与profile prod uberjar一起使用,或者将lein与profile dev repl一起使用,等等 但我的问题是,我一直无法弄清楚如何将一些公共值放入共享的区域,该区域可由开发、阶段、产品配置文件访问 基本示例 (附文件) 我尝试了这个,但运气不好 lein与prod-lein共享配置文件,借鉴了 例如,当我这样做时,我只在prod配置文件中获取变量。我

通过这种方法,您可以在
project.clj
中的单独文件(如下所示)中布局每个概要文件的环境变量

根据以下内容,可以将
lein与profile prod uberjar一起使用,或者将
lein与profile dev repl一起使用,等等

但我的问题是,我一直无法弄清楚如何将一些公共值放入
共享的
区域,该区域可由
开发、阶段、产品
配置文件访问

基本示例

(附文件)

我尝试了这个,但运气不好

lein与prod-lein共享配置文件,借鉴了


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

我认为这是
config
的一个限制。我试过这个(更明确):

但是,最后一个文件获胜,第一个文件被忽略。因此,对于
:dev
来说,共享内容被忽略,而对于
:prod
来说,prod内容被忽略(就像它不存在一样):

结果:

> 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

因此,您必须摆脱硬编码的文件名
config.edn
,创建类似
config-dev.edn
config-prod.edn
、和
config-shared.edn
。至少到那时,他们都可以生活在一个
/resources
目录中

config/shared/config.edn
config/dev/config.edn
config/stage/config.edn
config/prod/config.edn
:profiles {:dev    {:resource-paths ["config/shared" "config/dev"]}
           :prod   {:resource-paths [ "config/prod"  "config/shared"]}}
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
(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")