https://github.com/yogthos/config该方法让您可以将每个配置文件的环境变量放在单独的文件中,如下所示,在 project.clj
中。
根据下面的内容,可以使用 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 shared,prod lein
,借鉴了中的复合方法
https://github.com/technomancy/leiningen/blob/stable/doc/PROFILES.md#composite-profiles
例如,当我这样做时,我只能获取 prod
配置文件中的变量。
最佳答案
我认为这是config
的限制。我尝试过这个(更明确):
:profiles {:dev {:resource-paths ["config/shared" "config/dev"]}
:prod {:resource-paths [ "config/prod" "config/shared"]}}
但是,最后一个文件获胜,第一个文件被忽略。因此,对于 :dev
,共享内容将被忽略,对于 :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
目录中。
关于clojure - 在 clojure 中使用 yogthos/config 时,配置文件之间共享环境变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49868189/