我已经使用Clojure工作了几周,主要使用Lein+Luminus框架。我一直在寻找一种在REPL上调试代码的方法。
我非常喜欢pry(Ruby上的一个调试工具)的工作方式,特别是在调试和运行时调用方面。是否有类似于Clojure代码的pry等效工具?或者可能是我错过的技术/工具吗?
我已经使用Clojure工作了几周,主要使用Lein+Luminus框架。我一直在寻找一种在REPL上调试代码的方法。
我非常喜欢pry(Ruby上的一个调试工具)的工作方式,特别是在调试和运行时调用方面。是否有类似于Clojure代码的pry等效工具?或者可能是我错过的技术/工具吗?
binding.pry
调用的方式,因为它使您可以访问正在运行的应用程序,但它不用于在某个点停止执行,而是为您提供一个具有对正在运行的应用程序的访问权限的REPL,并且它本身不提供任何其他调试功能。
截至2015年5月,我强烈建议尝试使用JetBrain的Intellij IDEA和其Cursive插件进行编程,因为它在调试方面有着出色的支持。你可以使用免费的社区版Intellij,而Cursive插件目前也是免费的。
要安装Cursive,你需要进入Intellij的设置界面,添加适用于你的Intellij版本的正确的Cursive插件仓库,安装Cursive,并重新启动IDE。
一旦Cursive被激活,你可以通过"文件>打开..."在Intellij中简单地打开一个现有的Leiningen项目。要运行REPL,请单击主菜单中的"运行>编辑配置"。在出现的窗口中,单击左上角的"+"按钮,然后选择"Clojure REPL>本地"。我会将运行配置的名称从"未命名"更改为类似于"REPL"的东西,但保持默认值并按"确定"保存运行配置即可。
现在你有一种方法可以为你打开的项目设置REPL。你现在可以点击“运行>运行'REPL'”(或者您命名的运行配置),以获得一个普通的REPL,或者更好的是点击“运行>调试'REPL'”,以启动REPL调试模式,这将允许您使用Intellij的调试功能来调试Clojure代码。像任何调试器一样设置断点,添加断点条件,运行代码和检查帧、变量等。你应该按照这些指示为你的应用添加一个运行中的nREPL服务器,但这是最重要的部分:
=> (use '[clojure.tools.nrepl.server :only (start-server stop-server)])
nil
=> (defonce server (start-server :port 7888))
#'user/server
lein repl :connect <port>
。您可以在配置nREPL服务器时指定<port>
,就像上面展示的那样。它在启动时也会打印出来。clj-debugger 是一个基本的REPL调试器,提供了与 pry-debug
类似的功能。您可以考虑使用它作为CIDER和Cursive等工具中可用调试器的替代方案。
在Clojure中,调试是一个巨大的问题,因为我们不知道错误发生的位置。定义这个宏: (defmacro dbg[x] `(让 x# 等于 ~x),以了解错误被抛出的位置。