在Clojure中使用yogthos/config时如何在多Profile间共享环境变量?
解决yogthos/config中多Profile共享公共配置的问题
嘿,这个问题我之前折腾过,其实用Leiningen本身的profile继承特性就能完美解决!咱们直接看具体怎么实现:
首先,你可以在project.clj里定义一个:shared profile,专门存放所有环境(dev、stage、prod)都需要的公共配置和资源路径,然后让各个环境的profile通过*:extends*关键字来继承这个公共配置。
完整示例代码
(defproject edn-config-test "0.1.0-SNAPSHOT" ; 这里放项目的基础配置,比如依赖、插件等等 :dependencies [[org.clojure/clojure "1.11.1"] [yogthos/config "1.1.7"]] :profiles { ; 公共配置profile,存放所有环境共享的内容 :shared { :resource-paths ["config/shared"] :env { ; 公共配置项:所有环境都用相同值的配置 :db-port 5432 :service-name "edn-config-test" :default-timeout 30000 } } ; 开发环境profile,继承shared的配置 :dev { :extends :shared :resource-paths ["config/dev"] :env { ; 开发环境独有的配置,会覆盖shared中同名的配置项 :db-url "jdbc:postgresql://localhost/dev_db" :log-level :debug :enable-debug-tools true } } ; 生产环境profile,继承shared的配置 :prod { :extends :shared :resource-paths ["config/prod"] :env { :db-url "jdbc:postgresql://prod-db.example.com/prod_db" :log-level :info :enable-debug-tools false } } ; 预发布环境profile,同样继承shared的配置 :stage { :extends :shared :resource-paths ["config/stage"] :env { :db-url "jdbc:postgresql://stage-db.example.com/stage_db" :log-level :warn } } } )
关键知识点说明
- 继承与合并: 用*
:extends :shared*让各个环境profile继承公共配置,Leiningen会自动合并两者的配置。如果子环境profile里有和:shared同名的配置项,子环境的值会覆盖公共值,这刚好满足我们“公共配置复用,环境独有的配置单独定义”的需求。 - 资源路径合并:
:shared里的resource-paths会和各个环境的路径合并,你可以在config/shared目录下放公共的EDN配置文件(比如config/shared/config.edn),然后在config/dev、config/prod等目录下放对应环境的配置文件,yogthos/config会自动读取这些路径下的配置并合并成最终的配置集合。
实际使用命令
和你之前的用法一样,只需要指定对应的profile即可,公共配置会自动生效:
- 启动开发环境REPL:
lein with-profile dev repl - 打包生产环境可执行JAR:
lein with-profile prod uberjar - 启动预发布环境服务:
lein with-profile stage run
代码中读取配置
在你的Clojure代码里,依然用yogthos/config的常规方式读取,它会自动加载公共配置+当前环境的配置:
(require '[yogthos.config :as config]) ; 读取公共配置项 (config/get :service-name) ; 返回 "edn-config-test" (config/get :db-port) ; 返回 5432 ; 读取当前环境独有的配置项 (config/get :db-url) ; 根据启动时的profile返回对应的数据库地址 (config/get :log-level) ; 返回对应环境的日志级别
内容的提问来源于stack exchange,提问作者HeyWatchThis
相关产品推荐
相关产品推荐

