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

Clojure项目:如何在nrepl启动时加载本地开发环境变量

解决Leiningen项目NREPL启动时加载本地敏感环境变量的问题

完全可以通过project.clj里的:repl-options/:init钩子实现你的需求,核心思路是只在REPL启动时执行加载逻辑,敏感文件不提交到版本控制,具体步骤如下:

1. 准备本地环境变量文件

创建名为repl_env的文件,用Shell变量格式写入你的本地敏感配置:

export API_TOKEN="your-personal-dev-token"
export DB_CONN_STRING="jdbc:mysql://localhost:3306/dev_db"

把这个文件添加到.gitignore,避免提交:

# 本地REPL环境变量,请勿提交
repl_env

2. 配置Leiningen的REPL初始化钩子

修改project.clj中的:repl-options,添加:init代码块,实现加载repl_env并注入到JVM系统属性:

(defproject your-project "0.1.0-SNAPSHOT"
  ;; 其他项目配置(依赖、插件等)...
  :repl-options {:init (do
                         (let [env-file "repl_env"
                               ;; 通过Bash加载环境变量并输出所有变量
                               env-result (clojure.java.shell/sh "bash" "-c" (str "source " env-file " && printenv"))
                               env-lines (clojure.string/split (:out env-result) #"\n")]
                           ;; 解析每行变量,设置到JVM系统属性
                           (doseq [line env-lines]
                             (when-let [[_ key val] (re-matches #"([^=]+)=(.*)" line)]
                               (System/setProperty key val)))
                           (println "✅ 已加载本地REPL环境变量")))})

注:代码中用到的clojure.java.shell和clojure.string都是Clojure核心库,无需额外引入依赖

3. 在代码中使用这些变量

之后在你的Clojure代码里,可以通过System/getProperty获取加载后的变量:

(def api-token (System/getProperty "API_TOKEN"))
(def db-conn (System/getProperty "DB_CONN_STRING"))

关键说明

  • 仅在REPL启动时执行::init钩子仅在NREPL启动时运行,Leiningen打包(如lein uberjar)时不会执行,完全隔离生产环境与本地开发配置
  • 敏感信息安全:repl_env被加入.gitignore,每个开发者可以维护自己的专属配置,不会被提交到公共代码仓库
  • 兼容性适配:用Bash命令加载是因为大多数Clojure开发者使用类Unix环境(Linux/macOS/WSL),Windows用户可以切换到Git Bash执行lein repl,或调整命令为Windows CMD兼容格式(需对应修改解析逻辑)

内容的提问来源于stack exchange,提问作者Ashwin

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 22:17:46