Leiningen项目的project.clj中使用environ读取环境变量报错如何解决
问题原因
你遇到的报错核心原因是defproject配置中的函数调用未被正常求值:
- Leiningen解析
project.clj时默认将defproject的参数作为纯数据结构读取,你书写的(environ.core/env :doc-dir)没有被执行,直接作为Clojure列表(PersistentList)赋值给了:output-path字段 - codox处理该字段时需要传入合法的文件路径字符串,拿到列表类型自然触发类型不匹配报错
- 额外的时机问题:就算你强制对该表达式求值,environ插件加载、处理
profiles.clj中:env配置的时机晚于project.clj的解析阶段,此时也拿不到你配置的doc-dir值
解决方案
方案1(最稳妥,适合本地个性化配置)
直接将codox的路径配置放到profiles.clj中,Leiningen会自动合并profile配置覆盖project.clj中的对应项,不需要调用environ:
{:dev {:env {:doc-dir "/home/me/some/dir"} :codox {:output-path "/home/me/some/dir"}}}
删除你在project.clj中为:output-path赋值的代码即可。
方案2(需要动态读取environ变量时使用)
如果你确实需要通过environ变量动态控制输出路径,需要调整配置保证依赖和执行顺序:
- 首先确保
project.clj的:plugins列表中已经配置了environ的lein插件:
:plugins [[environ/environ.lein "1.2.0"]]
- 在
project.clj的顶部先引入environ的命名空间,再使用Leiningen的读取器求值宏#=强制对environ调用求值:
(require 'environ.core) (defproject your-project "0.1.0" ;; 其余配置省略 :codox {:output-path #=(environ.core/env :doc-dir)})
注意事项
如果需要多环境切换文档输出路径,更推荐使用Leiningen原生的profile切换能力,为不同profile配置不同的:output-path值,比直接在project.clj中调用函数兼容性更好。
内容的提问来源于stack exchange,提问作者gash
相关产品推荐
相关产品推荐

