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

标签 clojure environment-variables config profile

https://github.com/yogthos/config该方法让您可以将每个配置文件的环境变量放在单独的文件中,如下所示,在 project.clj 中。

根据下面的内容,可以使用 lein with-profile prod uberjarlein 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.ednconfig- prod.ednconfig-shared.edn。至少这样它们就可以生活在一个 ./resources 目录中。

关于clojure - 在 clojure 中使用 yogthos/config 时,配置文件之间共享环境变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49868189/

相关文章:

typescript - typescript 中的故事书配置

functional-programming - Clojure 与哪些函数式语言最相似?

json - 如何将clojure代码映射到JSON?

java - 使用私有(private)环境变量对类进行单元测试

java - 在java中动态加载配置的最佳方法?

PHP:对所有用户请求仅加载一次属性集(来自配置文件)

gradle - 如何从 gradle 应用程序插件运行 clojure main

map - 存储解构映射供以后使用

cmd - 无效的语法。默认选项不允许超过 '2' 次

windows - 在操作系统级别更改后更新 IntelliJ 环境变量