You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 04:19:46