我已经和Clojure合作了几个星期,主要是使用Lein + Luminus框架.我一直在寻找一种在REPL上调试代码的方法.
在调试和运行时调用方面,我非常喜欢pry(在Ruby上)的工作方式.对于clojure代码有没有相当于pry?或者可能是我错过的技术/工具?
有两种方法可以考虑改善您的REPL和调试体验:
第一个是建立本地Clojure开发环境的重要部分,无论如何都应该完成.第二个选项,使用嵌入式nREPL服务器,在使用中更接近于如何binding.pry
在代码中使用调用,因为它允许您访问正在运行的应用程序,但它不用于在某个点停止执行,而是为您提供一个可以访问正在运行的应用程序的REPL,它本身不提供任何其他调试功能.
像Emacs和Vim这样的文本编辑器具有出色的Clojure支持(用于编辑和与REPL交互),并且大多数Java IDE也支持Clojure.
此时(2015年5月)我强烈建议尝试将Jetbrain的Intellij IDEA与Cursive插件一起使用,因为它具有出色的调试支持.您可以使用Intellij的免费社区版,而Cursive插件(此时)也是免费的.
要安装Cursive,请进入Intellij的设置,为您拥有的Intellij版本添加正确的Cursive插件存储库,安装Cursive,然后重新启动IDE.
一旦Cursive处于活动状态,您只需通过"File> Open ..."在Intellij中打开现有的Leiningen项目.要运行REPL,请单击主菜单中的"运行>编辑配置".在出现的窗口中,单击左上角的"+"按钮,然后选择"Clojure REPL> Local".我将运行配置的名称从"未命名"更改为"REPL",但保留默认值并按"确定"以保存运行配置.
现在,您可以为已打开的项目运行REPL设置.现在,您可以点击"运行>运行'REPL’"(或任何你命名的运行配置)的正常REPL,或更好,但点击"运行>调试'REPL’"启动了REPL在调试模式,使您使用Intellij的调试功能来调试您的Clojure代码.设置断点,添加断点条件,运行代码并检查框架,变量等,就像在任何调试器中一样.
在您的情况下,您需要单击"运行>调试'REPL'",然后在该REPL中执行用于启动应用程序的代码.
上述方法假设您首先启动Clojure REPL然后启动您的应用程序.相反,如果你想让你的应用程序正常启动,然后可选地获得一个存在于正在运行的Clojure程序中的REPL,那么直接使用nREPL是你最好的选择.
从它自己的自述文件:
nREPL是一个Clojure网络REPL,它提供REPL服务器和客户端,以及IDE和其他可能需要在远程环境中评估Clojure代码的工具的一些常用API.
您应该按照这些说明将正在运行的nREPL服务器添加到您的应用程序中,但这是最重要的部分:
=> (use '[clojure.tools.nrepl.server :only (start-server stop-server)])
nil
=> (defonce server (start-server :port 7888))
#'user/server
Run Code Online (Sandbox Code Playgroud)
一旦你有一个运行nREPL服务器作为Clojure的应用程序的一部分,您可以使用编辑器或选择的IDE(每个编辑/ IDE有这样做的不同的方式,但最公开的方式来连接到运行REPL附加到它通过提供主机(通常是localhost)和运行nREPL服务器的端口,或者通过命令行直接调用Leiningen,如下所示:
lein repl :connect <port>
您可以指定<port>
配置nREPL服务器的时间,如上所示.它还会在启动时打印出来.