如何自动重新加载 Clojure 代码?

8

如何自动重新加载Clojure代码?

我已经看过这个演示。在那里,他们使用了一些热交换Clojure技术,每当源文件发生更改时就会重新加载代码。我可以运行代码,但无法观察到自动重新加载的效果。如何重新加载代码?

源代码。


2
你试过figwheel吗? - jmargolisvt
1
我在Code Review上提出了一个关于我的Clojure工作流的问题,你可能会发现它有用。 - Sam Estep
Figwheel会监视你的cljs/cljc文件,编译它们,然后将它们发送到浏览器以执行。据我所知,当你打开repl时,它不会对重新加载服务器端代码做太多事情(但可能是错误的)。 - Joel M
5个回答

4

根据情况,有很多种重新加载代码的方式:

  • Emacs/CIDER快捷键重新加载文件。可能Rich也在做类似的事情。另请参见:如何在REPL中重新加载Clojure文件
  • 监视文件并重新加载代码(前端开发中的figwheel测试插件以及专门用于运行测试的CIDER快捷键,boot有一个watch任务...)
  • 您使用的Web服务器的中间件(例如ring具有ring.middleware.reload/wrap-reloadpedestal也配备了one,其他像yada这样的Web服务器与组件兼容)
  • component工作流程也适用,其中有一个可以自动重新加载的系统示例,名为holy-grail

2

我没有完全重新观看这个视频,但是这些笔记是我在跳过视频并做出合理猜测后观察到的。

从我重新观看的这段视频中可以看出,Rich正在评估一个运行中的repl中的代码。这使他能够更改代码、评估它并查看不同的行为。

许多编辑器支持在Clojure repl中对缓冲区中的代码进行评估。这里有一些关于使用Emacs和CIDER互动地玩耍你的代码的文档。

与所讨论的视频无关,如果您正在使用ring进行Web开发。您可以使用wrap-reload中间件,在文件已更改并请求命中您的Web应用程序时自动重新加载代码。在开发Clojure Web应用程序时,这非常有用。

对于自动重新加载和运行clojure.tests,我推荐使用lein-test-refresh。它是一个Leiningen插件,可监视您的项目文件更改,当有变化时重新加载并运行您的测试。如果您的项目有测试,这将大大加快开发速度。


我自己一直在使用lein-test-refresh,并且非常成功!我经常在程序的顶层(不是在测试或函数内部)用vim添加一些代码,保存文件,在Leiningen窗口中查看输出,编辑,再次保存并查看输出等等。我通过这种方式很快地弄清楚了一些东西,然后只需将其包装在defn中即可使其成为程序的一部分。 - Ben Kovitz

2

使用mount来管理组件的启动和停止。例如,在后端Web应用中,您可能希望在启动Web服务器之前启动数据库。

然后在Emacs中可以有:

(defun cider-repl-refresh ()
(interactive)
(save-some-buffers)
(with-current-buffer (cider-current-repl-buffer)
(goto-char (point-max))
(insert (concat "(require 'clojure.tools.namespace.repl) "
                "(clojure.tools.namespace.repl/refresh)"))
(cider-repl-return)))

0

如果你不是特别喜欢Emacs(我喜欢Emacs,但嘿,并不是每个人都喜欢),LightTable也是Clojure/ClojureScript交互式编程的一个非常好的选择。

对于开发ClojureScript(编译成Javascript的Clojure),LightTableFigwheel是一个非常好的组合。

在我看来,LightTable在Web开发方面比Emacs有一些优势(我从未完美地让cider与ClojureScript配合工作),因为它是基于Electron构建的Chrome的专业版本。

请查看Figwheel GitHub页面上的此文档:使用LightTable运行Figwheel

LightTable + Fighweel


0
如果您正在使用IntelliJ中的Cursive IDE,那么有一个特殊的REPL工具需要设置以获得您所需的功能。它与终端窗口中的“lein repl”相比具有许多功能。
完整的教程在这里:https://cursive-ide.com/userguide/repl.html 但是,设置默认实例非常容易:
  1. 右键单击project.clj/deps.edn ->“Create Repl for...”。默认设置很好。点击ok/apply。
  2. 右键单击project.clj/deps.edn ->“Run Repl for...”(将打开一个repl窗口)
  3. 查看Tools->Repl以获取命令列表,例如:
  • 切换到repl窗口:Ctrl+\
  • 重新加载repl中的当前文件:Alt + Shift + L
  • 将函数defn发送到repl:Alt + Shift + M
  • ...等等
此外,在REPL中编写代码时,您将获得完整的代码完成、语法高亮等功能。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接