成功执行cider-jack-in后立即运行cider-refresh报No such var: user/reset
CIDER启动REPL后执行cider-refresh报
No such var: user/reset的排查方案 问题现场
- 完成
cider-jack-in成功启动REPL后,**立即执行cider-refresh**操作,触发编译报错:
Syntax error compiling at (*cider-repl my-project:localhost:54396(clj)*:1:1). No such var: user/reset
- 当前使用的CIDER启动命令为:
Startup: lein update-in :dependencies conj [acyclic/squiggly-clojure "0.1.9-SNAPSHOT"] -- update-in :dependencies conj [nrepl/nrepl "0.8.3"] -- update-in :plugins conj [refactor-nrepl "2.5.0"] -- update-in :plugins conj [cider/cider-nrepl "0.25.8"] -- repl :headless :host localhost
核心原因
cider-refresh的默认执行逻辑为:完成项目代码资源的热重载后,会尝试调用配置的后置回调函数,这个回调的默认值就是user/reset。刚完成REPL连接的瞬间,user命名空间尚未加载dev环境的自定义代码,不存在名为reset的变量定义,因此触发“找不到变量”的编译报错,和项目本身的业务代码逻辑无关。
分步排查解决
- 检查dev路径配置完整性
确认项目根目录的project.clj中,:devprofile是否正确将dev目录加入源码搜索路径,即是否配置了:source-paths ["dev"]。如果缺少该配置,CIDER启动REPL时不会自动加载dev/user.clj中的dev环境定义,自然不存在user/reset变量。 - 验证user.clj的定义有效性
打开dev/user.clj文件,确认是否在user命名空间下定义了reset函数(通常是配合组件系统、tools.namespace实现的重载-重置逻辑)。如果缺少该定义,需要补充对应的函数实现。 - 调整即时操作触发时机
刚连接上REPL时不要立刻执行refresh操作,可以先手动在REPL中执行(require 'user)加载dev环境代码,确认无报错后再执行cider-refresh,即可避免找不到变量的问题。 - 调整后置回调配置
如果你不需要refresh完成后自动调用重置函数,可以在Emacs配置中将cider-refresh-after-fn的值设为nil,从根源上取消对user/reset的查找和调用逻辑。 - 校验版本兼容性
你当前使用的cider-nrepl 0.25.8、refactor-nrepl 2.5.0搭配nrepl 0.8.3的版本组合,在冷启动REPL未加载任何业务代码时,会主动触发回调查找逻辑,如果出现频繁报错,可以将上述依赖版本升级到当前稳定的兼容版本,规避版本交互的bug。
内容的提问来源于stack exchange,提问作者beluchin
相关产品推荐
相关产品推荐

