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

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变量动态控制输出路径,需要调整配置保证依赖和执行顺序:

  1. 首先确保project.clj的:plugins列表中已经配置了environ的lein插件:
:plugins [[environ/environ.lein "1.2.0"]]
  1. 在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 23:45:03