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
相关产品推荐
相关产品推荐

